如何解决;“错误的操作数类型”;对于Java中的以下函数?

如何解决;“错误的操作数类型”;对于Java中的以下函数?,java,bit-manipulation,Java,Bit Manipulation,基本上,我想在Java中尝试按位操作,而C和Java似乎不以相同的方式处理位 public static boolean checkIsPowerOfTwo(int x) { return ( !(x & (x-1)) ); } 这个函数在Java中无法正常工作,因此我对位运算符的理解显然不适合Java 我得到的错误是 CheckIsPowerOfGivenNumber.java:13: error: bad operand type int for unary operato

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

public static boolean checkIsPowerOfTwo(int x) {
    return ( !(x & (x-1)) );
}
这个函数在Java中无法正常工作,因此我对位运算符的理解显然不适合Java

我得到的错误是

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

如何更正此问题?

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

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

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

实际上按位部分是正确的,问题是!是一个逻辑not——按位not(comm运算符是~)。尽管如此,您仍然有将int转换为布尔值的问题

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

这是c代码,不是Java。你在Java中发现了关于运算符的什么。你为什么希望它工作?
是一个布尔运算符。你试图将它应用于整数。这不起作用,它会编译,但将
!something
更改为
~ something==0
显然是错误的