2016-07-11 3 views
-6

'최대화 xor'문제를 해결하고 있습니다. (https://www.hackerrank.com/challenges/maximizing-xor)연산자 ^는 인수 유형에 대해 정의되지 않았습니다 int, boolean

코드에서와 같이 i 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; 
} 

하지만이 오류가 발생하는 이유는 무엇입니까?

운영자가 인수 형식 (들) 인터넷 용 '부울 정의되지^

당신은 표현 괄호를 둘 필요가
+1

다른 사람들이 귀하의 질문에 답변 한 반면,이 솔루션이 통과하는 동안 가장 효율적인 솔루션은 아니라는 점에 유의하십시오. XOR이 약간의 레벨에서 무엇을하는지 생각하려고한다면 더 빠르게 실행할 수 있습니다. – MathBunny

답변

5

: Java's operator precedence table에 따르면

if ((i^j) > max) 

, XOR 연산자 ^은 부등호 연산자 >보다 우선 순위가 낮습니다.

따라서 원래 작성된 표현 i^j > maxi^(j > max)으로 해석됩니다. 하지만 여기에 유형이 잘못되었습니다. iint이지만 (j > max)boolean입니다. 그래서 컴파일러 오류가 발생했습니다. 당신은 C/C++에서이 코드를 컴파일하면 보조 노트로


, 그것은 컴파일 것이다 그러나 그것은 기괴한 결과와 함께 실행됩니다. 이 경우 C/C++에서 동일한 연산자 우선 순위 규칙이 적용되지만 boolint (0 또는 1)으로 변환 된 다음 XOR이 진행되기 때문입니다. 이것은 위험하고 잘못되었을 것입니다. Java 컴파일러는 intboolean으로 XOR하는 것을 중단했습니다. 이는 무의미한 조작입니다.

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

으로 자바 해석됩니다.

관련 문제