如何在Java中解决下面函数的“坏操作数类型”?

时间:2015-11-29 07:19:08

标签: java bit-manipulation

基本上我想在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)) );
         ^

我该如何纠正?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

实际上按位部分是正确的问题!是一个逻辑不是 - 按位不是(comm运算符是〜。已经说过你仍然有你的int转换为布尔值的探测器。

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