我正在解决Hackerrank问题'最大化xor'。 (https://www.hackerrank.com/challenges/maximizing-xor)
我使用'if'语句检查i xor j是否大于'max',如代码所示。
static int maxXor(int l, int r) {
int max=0;
for(int i=l;i<r;i++)
for(int j=l;j<r;j++)
{
if(i^j>max)/*error part*/
max=i^j;
}
return max;
}
但为什么我会收到此错误?
对于参数类型int,boolean'
,运算符^未定义
答案 0 :(得分:5)
您需要在表达式周围添加括号:
if ( (i ^ j) > max )
根据Java's operator precedence table,XOR运算符^
的优先级低于不等运算符>
。
因此,i ^ j > max
的原始书面表达将被解释为i ^ (j > max)
。但是在这里,类型不正确:i
是int
,但(j > max)
是boolean
。这就是你得到编译器错误的原因。
作为旁注,如果你用C / C ++编译了这段代码,那么它就会被编译,但它会以奇怪的结果运行。这是因为在C / C ++中,在这种情况下适用相同的运算符优先级规则,但bool
将转换为0或1的int
,然后XOR将继续。这本来是危险和错误的。 Java编译器阻止您使用int
对boolean
进行异或操作,这将是一个无意义的操作。
答案 1 :(得分:3)
查看Java运算符优先级:http://bmanolov.free.fr/javaoperators.php。如您所见,整数比较(&lt;,&gt;)的优先级高于xor。所以你的语句在java中被解释为
if ( i ^ (j>max))
因此,您必须手动将语句添加到语句
if ( (i^j) > max)
以达到您想要的比较。