本文介绍在 JavaScript 中判断一个数字是否为 2 的 n 次方幂的两种常用方法。第一种通过循环除 2 取余判断,逻辑直观但效率较低;第二种利用位运算特性,通过 num & (num - 1) 是否为 0 进行快速判断,性能更优。文章包含具体代码实现与二进制原理解析。
判断 2 的 n 次方幂的方法概述
在之前的面试中,面试官曾提出一个问题:如何判断一个数字是否为 2 的 n 次方幂?起初我对这个概念并不熟悉,但在得到解释后,我查阅了相关资料并整理了以下两种判断方法。
方法一:循环除 2 法
方法一:循环除 2 法
判断一个数 num 是否为 2 的 n 次方幂,基本思路是不断将该数除以 2。如果余数为 0,则继续将商除以 2,重复此过程,直到最终结果为 1。若过程中出现余数不为 0 的情况,则不是 2 的 n 次方幂。
例如:
2:2 % 2 = 0,(2 / 2) = 1,结果是 1,因此是。
4:4 % 2 = 0,(4 / 2) % 2 = 0,(4 / 2 / 2) = 1,结果是 1,因此是。
6:6 % 2 = 0,(6 / 2) % 2 = 1,余数不为 0,因此不是。
7:7 % 2 = 1,余数不为 0,因此不是。
24:24 % 2 = 0,(24 / 2) % 2 = 0,(24 / 2 / 2) % 2 = 0,(24 / 2 / 2 / 2) % 2 = 1,最终余数不为 0,因此不是。
代码实现:
function check(num){
if(num != 1){
while(num != 1){
if(num%2 == 0){
num = num / 2;
}else{
return false;
}
}
return true;
}else{
return true;
}
}
运行结果如下:

方法二:位运算法
方法二:位运算法
利用二进制特性可以高效判断。2 的 n 次方幂的二进制表示中,最高位为 1,其余位均为 0。当该数减 1 时,最高位变为 0,其余位变为 1。因此,原数与减 1 后的数进行按位与运算,结果应为 0。
按位与运算规则:1 & 1 = 1,0 & 1 = 0,0 & 0 = 0,1 & 0 = 0。
2 的二进制为 10,3 的二进制为 11。
4 的二进制为 100,6 的二进制为 110。
8 的二进制为 1000,7 的二进制为 111。
具体例子:
8 的二进制是 1000,8 - 1 = 7 的二进制是 0111。进行按位与运算:1000 & 0111 = 0000。结果为 0,所以 8 是 2 的 n 次方幂。
9 的二进制是 1001,9 - 1 = 8 的二进制是 1000。进行按位与运算:1001 & 1000 = 1000。结果不为 0,所以 9 不是 2 的 n 次方幂。
24 的二进制是 11000,24 - 1 = 23 的二进制是 10111。进行按位与运算:11000 & 10111 = 10000。结果不为 0,所以 24 不是 2 的 n 次方幂。
可以通过 num.toString(2) 将数字转换为二进制字符串查看。
代码实现:
function check(num){
return (num > 0) && ((num & (num - 1)) == 0);
}
运行结果如下:

需要注意的是,1 也是 2 的 0 次方幂。
上述方法主要判断是否为 2 的 n 次方幂,未包含对整数类型的严格校验,实际应用中可根据需求补充整数判断条件。
以上关于 JavaScript 判断数字是否为 2 的 n 次方幂的内容分享完毕,希望能为读者提供参考。