2016-07-11 166 views
-6

私はHackerrankの問題「Maximizing xor」を解決しています。 (https://www.hackerrank.com/challenges/maximizing-xor演算子^は引数型int、booleanに対して未定義です

コードで示されているように、xor jが 'max'より大きいかどうかを確認するために 'if'ステートメントを使用しました。

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

Java's operator precedence tableによると

if ((i^j) > max) 

、 XOR演算子^は、不等式演算子>よりも優先順位が低くなります。

したがって、元の書かれた式i^j > maxは、i^(j > max)と解釈されます。しかし、ここではタイプが正しくありません:iintですが、(j > max)booleanです。だからあなたはそのコンパイラエラーを持っています。サイドノートとして


あなたはC/C++でこのコードをコンパイルした場合、それがコンパイルされているだろうが、それは奇妙な結果で実行されます。これは、C/C++ではこの場合同じ演算子優先ルールが適用されますが、boolintに変換されてXORが実行されるためです。これは危険で間違っていたでしょう。 Javaコンパイラは、intをXORすることを、booleanで停止しました。これは無意味な操作になります。

+0

はい、これは '>'が '^'の前に評価されるからです。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.htmlを参照してください。 – Zircon

3

Javaの演算子の優先度:http://bmanolov.free.fr/javaoperators.phpを見てください。ご覧のとおり、整数比較(<、>)はxorよりも優先されます。だからあなたの文はあなたが手動でご希望の比較を達成するためにあなたの声明

if ((i^j) > max) 

に括弧を追加する必要があります

if (i^(j>max)) 

として、Javaで解釈されます。

関連する問題