基本上我想在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)) );
^
我该如何纠正?
答案 0 :(得分:2)
与C相比,Java类型系统更严格。特别是它不执行从int
到boolean
的自动转换(这实际上有助于防止许多愚蠢的错误)。 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);