一、题目二、思路三、代码
一、题目
要是2的幂,可以回想二进制数中,什么样的二进制数对应的十进制是2的幂呢,就是在二进制数中,只有一个1,其余都是0。所以我们只需要判断给定的数的二进制数,如果只有一个1则返回true了。
位运算的技巧:
n & (n - 1)可以将n的二进制位的最低位1移除。如1000和0111做与运算后得到0000,即将1000的最低位的1移除了,然后再判断其余位是否都是0。所以我们可以n > 0 && (n & (n - 1)) == 0进行判断。n & (-n)即n与其相反数做与运算。由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1。有关n & (-n)的结论:如果n是真整数n & (-n) == n,则n是2的幂。
简单证明:假如n的二进制位为
(
a
10...0
)
2
(a10...0)_{2}
(a10...0)2(其中a为若干个高位,是0或1都行),则-n每位按位取反,加1后为
(
a
ˉ
01
⋯
1
)
2
+
(
1
)
2
=
(
a
ˉ
10
⋯
0
)
2
(bar{a} 01 cdots 1)_{2}+(1)_{2}=(bar{a} 10 cdots 0)_{2}
(aˉ01⋯1)2+(1)2=(aˉ10⋯0)2然后n & (-n)运算后,结果的高位全部为0,最低位的1和后面的0都没有变化,因此我们可以用n > 0 && (n & -n) == n判断这题。
三、代码
class Solution {
public:
bool isPowerOfTwo(int n) {
//return n > 0 && (n & (n - 1)) == 0; //法二
return n > 0 && (n & -n) == n;
}
};



