2016-07-11 174 views
-6

我正在解决Hackerrank问题'最大化xor'。 (https://www.hackerrank.com/challenges/maximizing-xor运算符^未定义为参数类型int,布尔值

我已经使用'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,布尔”

+1

虽然其他人已经回答了您的问题,但请注意,虽然此解决方案会通过,但它不是最有效的解决方案。如果您尝试去思考XOR在某个层面上做了什么,那么可以让它运行得更快。 – MathBunny

回答

5

你需要把括号周围的表达:

if ((i^j) > max) 

Java's operator precedence table, XOR运算符^的优先级低于不等式运算符>

因此,您的原始书面表达i^j > max将被解释为i^(j > max)。但是在这里,类型不正确:iint,但(j > max)boolean。这就是你得到编译器错误的原因。作为一个方面说明,如果你用C/C++编译这个代码,它会编译,但它会运行奇怪的结果。这是因为在C/C++中,在这种情况下适用相同的运算符优先级规则,但bool将转换为0或1的int,然后XOR会继续。这将是危险的和错误的。 Java编译器阻止您将intboolean异或,这将是一种无意义的操作。

+0

是的,这是因为在'^'之前评估'>'。请参阅https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – Zircon

3

看看Java的运算符优先级:http://bmanolov.free.fr/javaoperators.php。正如你所看到的,整数比较(<,>)优先于xor。所以,你的发言是Java解释为

if (i^(j>max)) 

所以你必须手动才能达到您想要的比较括号添加到您的发言

if ((i^j) > max) 

相关问题