判断一个整数是否是2的幂,以下是几种快速方法:
-
位运算(n & (n - 1))
条件:n > 0
且(n & (n - 1)) == 0
原理:2的幂的二进制仅有一个1。n-1
会将最低位的1变为0,后续位全为1。此时按位与结果为0。 -
位运算(n & (-n))
条件:n > 0
且(n & -n) == n
原理:补码中,-n
是n的取反加1。若n是2的幂,其二进制仅有一个1,n & -n
会保留该1,结果等于n。 -
统计二进制中1的个数
条件:n > 0
且二进制中1的个数为1。
实现:利用内置函数(如Integer.bitCount(n)
)或Brian Kernighan算法快速统计1的个数。 -
数学对数法
条件:n > 0
且log2(n)
为整数。
注意:存在浮点精度问题,需验证结果,如(1 << (int)log2(n)) == n
。 -
查表法
条件:预先生成所有可能的2的幂值(如32位整数范围内),检查n是否在表中。
总结:前两种位运算方法最为高效(O(1)时间复杂度),推荐使用。其他方法在特定场景下也可行,但需注意限制条件。