开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天
题目:判断一个数是否为4的整数幂,例如:1 = 4^0,16 = 4^2,而2不等于4的整数幂。
力扣编号:342
算法一:循环除法
这是最简单易想的算法,既然要判断一个数是不是4的幂,那我们就一个一个除来看看嘛👇
while(n>1){
n/=4
}
if(n===1){
return true;
}else{
return false;
}
算法二:求模法
既然是4的幂,那前提它必须是2的幂,而2的幂怎么判断呢?
在二进制中:
2的二进制表示为10
4的二进制表示为100
8的二进制表示为1000
就这样,每乘以2,零多出一位,意味着二的幂只有最高位为1,其余位均为0,那么他们减一就可以表示为最高位为0,其余位数均为1:
2-1的二进制表示为01
4-1的二进制表示为011
8-1的二进制表示为0111
如若让2^n与2^n - 1相与,则必会等于0,反之,只要数字n与n-1进行与运算,若等于0,则n就是2的幂
现在我们可以先判断出数字是否为2的幂,若为二的幂,则令其与3取模,若是2的幂而不是4的幂,那么与3取模的结果必定为2,若为4的幂,那么与3取模的值便为1,利用这点,我们便可以进行判断:
(n&(n-1))===0 && n%3===1
算法三:
上面提到过2的幂如何判断,2的幂以二进制来表示的话,为100...0形式,只有最高位为1,那4的二进制表示呢?
4->100,从0起算,1位于第2位
16->10000,从0起算,1位于第4位
64->1000000,从0起算,1位于第6位
如此看来,在4的幂中,1位于其偶数位,那就意味着,我们先判断其是否为2的幂,再判断其最高位是否为偶数位,即可判断该数字是否为4的幂
那么如何判断最高位在不在偶数位呢?
我们依然利用相与运算来计算:
我们令一串二进制数中,偶数位均为0,奇数位均为1:10101010...101010,令n与这串数字相与,若得数为0,则证明n中的奇数位均为0,这样,我们就判断出了4的幂。(假设10101010...101010为32位,那么就可以简写为0xaaaaaaaa)。
最终判断方式如下:
(n & (n - 1)) === 0 && (n & 0xaaaaaaaa) === 0