Java下面的函数如何求解"Bad operand type"?

How to solve "Bad operand type" for the function below in Java?

基本上我想在 Java 中尝试按位操作,但似乎 C 和 Java 不以相同的方式处理位。

public static boolean checkIsPowerOfTwo(int x) {
    return ( !(x & (x-1)) );
}

这个函数 taken from here 在 Java 中没有按预期工作,所以我对按位运算符的理解显然不适合 Java。

我得到的错误是

CheckIsPowerOfGivenNumber.java:13: error: bad operand type int for unary operator '!'
return ( !(x & (x-1)) );
         ^

我该如何纠正?

Java 类型系统比 C 更严格。特别是它不会执行从 intboolean 的自动转换(这实际上有助于防止许多愚蠢的错误)。 Java 中的 ! 运算符仅适用于布尔类型。使用 == 运算符显式比较值与 0:

public static boolean checkIsPowerOfTwo(int x) {
    return (x & (x-1)) == 0;
}

实际上 (x & (x-1)) == 0 也是一个有效的 C 代码,但看起来绝对不那么神秘。我也建议用这种方式在 C 上编写。

实际上按位部分是正确的问题是!是一个逻辑非 --- 按位非(comm 运算符是 ~。话虽如此,你仍然有将 int 转换为布尔值的问题。

    return ((~(x &(x-1)) == 0);