Skip to content
← 返回算法列表
问题与数据结构

判断 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))
}

继续阅读