如何在JAVA中使用&(a-1)== 0检查长数据类型编号是否为2的幂

时间:2015-08-09 15:10:45

标签: java operators

这是我试过的。它说第二个操作数是布尔值,而第一个操作数是长的。所以&运算符未定义为long和boolean。

public static void powerOfTwo(long a){
   if(a & (a-1) == 0 )
      System.out.println("it's a power of two");
   else
      System.out.println("NOT a power of two");
}

2 个答案:

答案 0 :(得分:3)

您必须将表达式包装在额外的括号中:

public static void powerOfTwo(long a) {
    if ((a & (a - 1)) == 0)
        System.out.println("it's a power of two");
    else
        System.out.println("NOT a power of two");
}

那是因为运营商==优先于&(请参阅here),所以没有大括号,你有

a & (a - 1) == 0

相同
a & ((a - 1) == 0)

然后编译器抱怨比较long(a)和布尔(a-1 == 0)

答案 1 :(得分:0)

您可以使用

return a != 0 && ((a & (a-1)) == 0);
然而,这是模糊不清的。更简单的方法是

return Long.bitCount(a) == 1

这也不完全明显,但只有一位设置意味着它必须是2的幂。