三种方式判断一个数是否为4的整数幂

155 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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