Java 未定义参数类型int、boolean的运算符^

Java 未定义参数类型int、boolean的运算符^,java,operator-precedence,boolean-operations,Java,Operator Precedence,Boolean Operations,我正在解决Hackerrank问题“最大化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;

我正在解决Hackerrank问题“最大化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-maxor(int-l,int-r){
int max=0;

对于(int i=l;i,需要在表达式周围加括号:

if ( (i ^ j) > max )

根据,异或运算符
^
的优先级低于不等式运算符

因此,
i^j>max
的原始书面表达式将被解释为
i^(j>max)
。但是这里的类型不正确:
i
是一个
int
,但是
(j>max)
是一个
boolean
。这就是为什么会出现编译器错误



作为旁注,如果你用C/C++编译这段代码,它会编译,但运行时会产生奇怪的结果。这是因为在C/C++中,同样的运算符优先规则适用于这种情况,但是
bool
会被转换成
int
的0或1,然后异或会继续。这是危险和错误的。Java编译器阻止您使用
布尔值对
int
进行异或运算,这将是一个无意义的操作。

请查看Java运算符优先级:。正如您所看到的,整数比较()的优先级高于异或。因此,您的语句在Java中被解释为

if ( i ^ (j>max))
因此,您必须手动将paren添加到您的语句中

if ( (i^j) > max)

为了实现您想要的比较。

是的,这是因为
^
之前进行了评估。请注意,虽然其他人已经回答了您的问题,但请注意,虽然此解决方案可以通过,但它并不是最有效的解决方案。如果您尝试在位级别上思考XOR的功能,则可以使其运行得更快。