2016-07-11 3 views
-6

Я решаю проблему Hackerrank «Максимизация xor». (https://www.hackerrank.com/challenges/maximizing-xor)оператор^не определен для типа аргумента int, boolean

Я использовал оператор «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; 
} 

Но почему я получаю эту ошибку?

оператор^не определен для типа аргумента (ов) межд, логическое»

+1

В то время как другие люди ответили на ваш вопрос, обратите внимание, что хотя это решение пройдет, это не самое эффективное решение. Вы можете заставить его работать быстрее, если попытаетесь понять, что XOR делает на бит уровне. – MathBunny

ответ

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 будет преобразован в int из 0 или 1, а затем XOR продолжит работу. Это было бы опасно и неправильно. Компилятор Java остановил вас от XORing int с boolean, что было бы бессмысленной операцией.

+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) 

для достижения нужного сравнения.

Смежные вопросы