bool isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
return (n & (n - 1)) == 0;
}
return (n & (n - 1)) == 0;
这句代码使用了位运算来判断一个数 n
是否是2的幂。
-
(n - 1)
:首先,我们将n
减去1。这样做的原因是,如果一个数是2的幂,那么它的二进制表示中只有一位是1,其他位都是0。减1后,这个1会变成0,后面的所有位都会变成1。例如,如果n = 8
,其二进制表示为1000
。n - 1
的结果为7
,其二进制表示为0111
,我们可以看到最右边一位变为0,后面的所有位都变为1。 -
n & (n - 1)
:接下来,我们将n
和(n - 1)
进行按位与操作。按位与操作的规则是,对于每一位,如果两个对应位都是1,则结果为1,否则为0。这个按位与操作的结果是,会保留
n
的二进制表示中最右边的1,将其它位都变为0。如果n
是2的幂,那么它的二进制表示中只有一位是1,其它位都是0,所以(n & (n - 1))
的结果就是0。例如,对于
n = 8
,其二进制表示为1000
,(n & (n - 1))
的结果为0000
。 -
(n & (n - 1)) == 0
:最后,我们使用相等运算符==
来判断(n & (n - 1))
的结果是否为0。如果等于0,就意味着n
是2的幂,返回true
;否则,返回false
。例如,对于
n = 8
,(n & (n - 1))
的结果为0000
,与0相等,所以返回true
。 -
这个函数利用了2的幂的特征:一个2的幂减1后,得到的二进制数的所有位都是1。所以,如果一个数
n
是2的幂,那么(n & (n - 1))
的结果就是0。这个方法比较高效,只需要进行几次位运算就可以得到结果。