判断 2 的幂
位运算
说明
正的 2 的幂仅有一个置位;x 与 x−1 按位与后为零。
分析
正的 2 的幂在二进制表示里恰好只有一个 1,减一后该位以下全变成 1。两数按位与因此得到零。
图解推演
16=10000,减一为 01111,交集为 0;18=10010,减一为 10001,交集仍为 10000,因此不是 2 的幂。判定必须和 n>0 同时成立,0 也会让按位与表达式等于 0,却不属于正的 2 的幂。
查看图表代码
适用前提与边界
必须先排除零,否则无符号整数的减法会下溢,且零本身也不是 2 的幂。
示例输入与调用
go
fmt.Println(IsPowerOfTwo(16), IsPowerOfTwo(18))运行输出
text
true false完整 Go 示例
go
package main
import "fmt"
func IsPowerOfTwo(x uint) bool {
return x > 0 && x&(x-1) == 0
}
func main() {
fmt.Println(IsPowerOfTwo(16), IsPowerOfTwo(18))
}继续阅读
- 算法推演
- 算法推演
- 算法推演