如何判断一个数是否为2的幂次方
字数 1256 2025-11-14 06:57:10
如何判断一个数是否为2的幂次方
题目描述
给定一个整数n,判断它是否是2的幂次方。如果是,返回true;否则返回false。2的幂次方指的是形如2^k(k为非负整数)的数,例如1(2^0)、2(2^1)、4(2^2)、8(2^3)等。
解题过程
-
理解2的幂次方的二进制特征
在二进制表示中,2的幂次方数有一个关键特征:其二进制形式仅包含一个"1",且其余位均为"0"。例如:- 1的二进制:0001(仅第0位为1)
- 2的二进制:0010(仅第1位为1)
- 4的二进制:0100(仅第2位为1)
- 8的二进制:1000(仅第3位为1)
这一特征是所有解法的核心依据。
-
基础解法:循环除以2
- 步骤:
- 若n ≤ 0,直接返回false(2的幂次方必须是正数)。
- 当n > 1时,重复以下操作:
- 若n除以2的余数不为0,说明n不是2的幂次方,返回false。
- 否则,将n更新为n/2。
- 循环结束后,说明n最终变为1,返回true。
- 时间复杂度:O(log n),空间复杂度O(1)。
- 示例:n=8 → 8÷2=4 → 4÷2=2 → 2÷2=1 → 返回true。
- 步骤:
-
位运算解法:利用n & (n-1)
- 原理:
- 对于任意2的幂次方n,其二进制形式为"10...0",则n-1的二进制形式为"01...1"。
- 将n与n-1进行按位与操作(&),结果必为0。例如n=8(1000),n-1=7(0111),1000 & 0111 = 0000。
- 若n不是2的幂次方(如n=6,二进制110),n-1=5(101),110 & 101 = 100 ≠ 0。
- 步骤:
- 若n ≤ 0,返回false。
- 计算n & (n-1),若结果为0,返回true;否则返回false。
- 时间复杂度:O(1),仅需一次位运算。
- 注意:需单独处理n=0的情况,因为0 & (-1) 可能引发未定义行为(实际中0-1=-1,需避免)。
- 原理:
-
位运算解法:利用n & (-n)
- 原理:
- 负数在计算机中以补码形式表示,-n等于n的二进制取反后加1。
- 对于2的幂次方n,其二进制仅最高位为1,-n会保留该位,其余位取反后加1,最终n & (-n)的结果等于n本身。例如n=8(1000),-n=-8(补码为1000),1000 & 1000 = 1000 = 8。
- 若n不是2的幂次方(如n=6,二进制110),-n=-6(补码为1010),110 & 1010 = 0010 ≠ 6。
- 步骤:
- 若n ≤ 0,返回false。
- 计算n & (-n),若结果等于n,返回true;否则返回false。
- 时间复杂度:O(1),同样仅需一次位运算。
- 原理:
-
边界情况与优化
- 处理n=0:所有解法均需先排除n≤0的情况,因为0和负数不是2的幂次方。
- 推荐解法:n & (n-1)解法最简洁高效,且易于理解,是面试中的常见答案。
总结
判断2的幂次方的核心是利用其二进制特征。优先掌握n & (n-1)的位运算解法,它既高效又直观,适用于大多数编程语言。