判断一个整数是否是2的幂,以下是几种快速方法:

  1. 位运算(n & (n - 1))
    条件n > 0(n & (n - 1)) == 0
    原理:2的幂的二进制仅有一个1。n-1会将最低位的1变为0,后续位全为1。此时按位与结果为0。

  2. 位运算(n & (-n))
    条件n > 0(n & -n) == n
    原理:补码中,-n是n的取反加1。若n是2的幂,其二进制仅有一个1,n & -n会保留该1,结果等于n。

  3. 统计二进制中1的个数
    条件n > 0 且二进制中1的个数为1。
    实现:利用内置函数(如Integer.bitCount(n))或Brian Kernighan算法快速统计1的个数。

  4. 数学对数法
    条件n > 0log2(n)为整数。
    注意:存在浮点精度问题,需验证结果,如(1 << (int)log2(n)) == n

  5. 查表法
    条件:预先生成所有可能的2的幂值(如32位整数范围内),检查n是否在表中。

总结:前两种位运算方法最为高效(O(1)时间复杂度),推荐使用。其他方法在特定场景下也可行,但需注意限制条件。