思路
首先需要区分开 2^N 和 2N。2N 很好判断,直接看数字能否被2整除即可。如果想用类似 2N 的思路去判别 2^N,可能就需要递归计算 N=N/2。
不过借助二进制表示的性质,可以简化 2^N 的判别。
假设一个正整数 val 的表示形式为1XX...X。
假如它是2的幂,
val的表示形式必然是100...0,并且val-1的表示形式会是011..1。则有val & (val-1) == 0假如它不是2的幂,
val的表示形式会是1XX...X,它的末尾数字中至少有一位为1, 则val-1无需借最开始的1,val-1表示形式会是1XX...X。则有val & (val-1) != 0
而任意一个正整数 val 要么是2的幂,要么不是2的幂,上面讨论已经概括了所有的正整数。
上述两个命题的逆否命题分别为:
对于一个正整数 val:
- 假如
val & (val-1) != 0,则它不是2的幂 - 假如
val & (val-1) == 0,则它是2的幂
代码
1 | bool isPowOf2(int val) { |