다음 코드 스 니펫을 발견했습니다.
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 ))
이 x
1보다 크거나 마지막 비트 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
실제로되지 0x1
… xor
보내고 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 )
. 이 모호한 방법의 이유는 이전 비트 조작 기술이 사용되고 아마도 프로그램의 다른 위치에서 사용 되었기 때문일 수 있습니다.