最近在看 netty 源码的一些实现,偶然看到这个判断数字是否为2的幂次方的方法,觉得很高效,所以贴出来跟大家一起分享:
private static boolean isPowerOfTwo(int val) {
return (val & -val) == val;
}
由于与运算符是处理器运算,要比其他的运算高效得多,这里拿8来举个例子:
- 8 的二进制为 1000
- -8 的二进制补码为正码取反加一,为 1000
- 进行位与运算之后,8 & -8 结果仍为 8
- 事实上,以2为幂次方的的数字,都是最高位为1,其余为0,所以对应负数的补码还是自己