一种判断数值是否为2的整数幂的方法

102 阅读1分钟

在golang slice扩容方法中有一种判断一个整数数值是否为2的整数次幂的方法。通过位运算的方式,具有极高的效率。具体如下:


func isPowerOfTwo(x uintptr) bool {
    return x&(x-1) == 0
}

通过分析我们发现一个满足2^n的整数的二进制都有首位为1,其余位都为0的特点。而2^n-1的二进制都满足低位全部为1。x&(x-1)刚好满足==0的特点。例如:

x			x-1
1	1		0	0
2	10		1	01
4	100		3	011
8	1000	7	0111
16	10000	15	01111

上述方法需要在使用前做边界检查,x>0的整数

func powerOfTwo(x int) bool {
	return x != 0 && x&(x-1) == 0
}