[c++] (x ^ 0x1)! = 0 무엇을 의미합니까?

다음 코드 스 니펫을 발견했습니다.

if( 0 != ( x ^ 0x1 ) )
     encode( x, m );

무슨 x ^ 0x1뜻입니까? 이것이 표준 기술입니까?



답변

XOR 연산 ( x ^ 0x1)은 비트 0을 반전시킵니다. 따라서이 표현은 x의 비트 0이 0이거나 x의 다른 비트가 1이면 표현식이 참임을 의미합니다.

반대로 x == 1이면 표현식이 false입니다.

따라서 테스트는 다음과 같습니다.

if (x != 1)

그러므로 (논쟁 적으로) 불필요하게 난독 화된다.


답변

  • ^비트 XOR 연산입니다
  • 0x1이다 1진수 표기법으로
  • x ^ 0x1의 마지막 비트를 뒤집습니다 x(확실하지 않은 경우 위 링크의 XOR 진리표 참조).

따라서 조건 (0 != ( x ^ 0x1 ))x1보다 크거나 마지막 비트 x가 0 이면 조건 이 참 이됩니다. 조건이 거짓이 될 값으로 x == 1 만 남습니다. 따라서

if (x != 1)

PS Hell은 그러한 간단한 조건을 구현하는 방법을 추가 할 수 있습니다. 하지마 복잡한 코드를 작성해야하는 경우 주석을 남기십시오 . 당신을 간청합니다.


답변

이것은 지나치게 단순화 된 설명처럼 보이지만, 누군가가 천천히 살펴보고 싶다면 아래에 있습니다.

^c, c ++ 및 c # 의 비트 XOR 연산자입니다.

비트 XOR은 길이가 같은 두 개의 비트 패턴을 사용하여 각 해당 비트 쌍에 대해 논리 배타적 OR 연산을 수행합니다.

배타적 OR은 두 입력이 다를 때마다 true를 출력하는 논리 연산입니다 (하나는 true, 다른 하나는 false).

진리표의 XOR B :

a           b        a xor b
----------------------------
1           1           0
1           0           1
0           1           1
0           0           0

따라서 0 == ( x ^ 0x1 )이진 수준 의 표현을 보여 드리겠습니다 .

             what? xxxxxxxx (8 bits)
               xor 00000001 (hex 0x1 or 0x01, decimal 1)
             gives 00000000
---------------------------
the only answer is 00000001

그래서:

   0 == ( x ^ 0x1 )    =>    x == 1
   0 != ( x ^ 0x1 )    =>    x != 1


답변

배타적 OR (XOR) 연산자입니다. 그것이 어떻게 작동하는지 이해하려면이 간단한 코드를 실행할 수 있습니다

    std::cout << "0x0 ^ 0x0 = " << ( 0x0 ^ 0x0 ) << std::endl;
    std::cout << "0x0 ^ 0x1 = " << ( 0x0 ^ 0x1 ) << std::endl;
    std::cout << "0x1 ^ 0x0 = " << ( 0x1 ^ 0x0 ) << std::endl;
    std::cout << "0x1 ^ 0x1 = " << ( 0x1 ^ 0x1 ) << std::endl;

출력은

0x0 ^ 0x0 = 0
0x0 ^ 0x1 = 1
0x1 ^ 0x0 = 1
0x1 ^ 0x1 = 0

이 표현은

0 != ( x ^ 0x1 )

x! = 0x1 일 때만 참이됩니다.

x 자체는 변경되지 않습니다. x가 0인지 1인지 만 확인합니다.이 rxpression은

if ( x != 0x1 )


답변

그것은 검사 x실제로되지 0x1xor보내고 x함께 0x1하면 0으로됩니다 만 x입니다 0x1…이 대부분 어셈블리 언어로 사용하는 오래 된 트릭


답변

^연산자는 비트 단위 XOR된다. 그리고 16 진수 상수로 작성된 0x1숫자 1입니다.

따라서 x ^ 0x1와 동일 x하지만 가장 중요도가 낮은 비트가 뒤집힌 새 값으로 평가됩니다 .

이 코드는 매우 복잡하고 모호한 방식으로 x와 1을 비교하는 것 이상을 수행하지 않습니다.


답변

xor (배타적) 연산자는 하나 이상의 비트를 반전시키는 데 가장 일반적으로 사용됩니다. 연산은 비트 중 정확히 하나가 1인지 묻는 것입니다. 이는 다음 진리표로 이어집니다 (A 및 B는 입력, Y는 출력).

A    B    Y
0    0    0
0    1    1
1    0    1
1    1    0

이제이 코드의 목적은 마지막 비트가 1이고 다른 비트가 0인지 확인하는 것 같습니다 if ( x != 1 ). 이 모호한 방법의 이유는 이전 비트 조작 기술이 사용되고 아마도 프로그램의 다른 위치에서 사용 되었기 때문일 수 있습니다.