Java:查找数字是否为2的幂
找到的解决方案如下:
private static boolean isPowerOfTwo(int number) {
if(number <=0){
throw new IllegalArgumentException(number + " is too small.");
}
if ((number & -number) == number) {
return true;
}
return false;
}
但无法理解其中一条if语句。
这里的if ((number & -number) == number)
是什么意思
# 1 楼答案
Find if a number is a power of two without math function or log function
这很好地解释了你的问题。单与
&
是一种位与运算。有关详细信息,请参阅链接# 2 楼答案
&;是位AND运算符。你需要知道一些二进制数才能知道这个函数是如何工作的
负数用two's complement表示法表示,最左边的位用于指示该数字是正数(如果0)还是负数(如果1)
如果一个数字是由一系列二进制数字表示的,那么这个数字是2的幂,除了一个数字外,其他数字的值都是0。例如,2^6=64由0100 0000表示
通过应用按位NOT运算符(即,将所有0更改为1,将所有1更改为0)计算相应的负数,然后将1添加到结果中-在我们的示例中:
如果将2个二进制数排列在一起:
然后按位和,得到的数字是原始数字64:
这就解释了为什么
number & -number == number
被用来确定一个数字是否是2的幂。 为了证明这一点,让我们试着用另外两个不是2的幂的数: