(x ^ 0x1) != 0은 무슨 뜻입니까?
나는 다음과 같은 코드 조각을 우연히 발견했다.
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
무인 does does 가 뭐죠?x ^ 0x1
열해? 게??
^
비트 단위 XOR 연산입니다.0x1
1
표기의 16진수x ^ 0x1
시킵니다.x
(XOR의 XOR의 XOR의 XOR의 XOR의 XOR의 XOR의 XOR의 XOR.
입니다.(0 != ( x ^ 0x1 ))
로 되어 있다x
가 1인 x
입니다. 조건이false가 .0틀리다 '아, 아, 아, 아, 아, 아, 아, 아, 맞다'에 해당이 되는 죠.
if (x != 1)
추신. 그런 간단한 조건을 구현하는 방법은 지옥같다고 덧붙이겠습니다.그러지마세요.그리고 복잡한 코드를 작성해야 한다면 댓글을 남겨주세요.부탁합니다.
연산XOR)x ^ 0x1
는 비트0을 시킵니다).이면 true가.
반대로 x == 1이면 식이 false입니다.
따라서 테스트는 다음과 같습니다.
if (x != 1)
따라서 불필요하게 난독화됩니다.
이는 지나치게 단순화된 설명처럼 보일 수 있지만, 누군가가 천천히 살펴보기를 원한다면 다음과 같습니다.
^
는 c, c++ 및 c#의 비트 단위 XOR 연산자입니다.
비트 단위 XOR은 길이가 같은 2개의 비트 패턴을 취하여 대응하는 각 비트 쌍에 대해 논리 배타적 논리합 연산(OR)을 수행합니다.
배타적 OR은 두 입력이 다를 때마다 true를 출력하는 논리 연산입니다(하나는 true, 다른 하나는 false).
a 또는 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일 때만 true가 됩니다.
x 자체는 변경되지 않습니다.x가 0인지 1인지 확인만 합니다.이 rexpression은 다음과 같이 변경될 수 있습니다.
if ( x != 0x1 )
「 」가 됩니다.x
는 아니다0x1
xor
x
0x1
, 0이 되다 0이 되다.x
0x1
어셈블리 입니다...이것은 어셈블리 언어에서 주로 사용되는 오래된 속임수입니다.
^
연산자는 비트 단위 xor입니다. ★★★★★★★★★★★★★★★★★.0x1
입니다.1
열여섯 살
so,는,x ^ 0x1
x
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.
이 코드는 x와 1을 매우 복잡하고 불명확한 방식으로 비교하는 것에 불과하다.
xor(exclusive 또는 ) 연산자는 하나 이상의 비트를 반전하는 데 가장 일반적으로 사용됩니다.이 조작은 비트 중 하나가 정확히 1인지 여부를 확인하는 것으로, 다음과 같은 참표(A와 B는 입력, Y는 출력)로 이어집니다.
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
비트가로, 1로, 0으로, 라고 하는 것입니다.이것은 같은 값입니다.if ( x != 1 )
이 불분명한 방법은 이전 비트 조작 기술이 사용되었기 때문에 프로그램 내의 다른 장소에서 사용되었을 수 있습니다.
^
는 비트 단위입니다.xor operator
c
1과 를 들어 xor'ed는 1입니다. ★★★★★★★★★★★★★★★★★,x
이면 10이 됩니다.10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
비트 단위 테스트는 의도적인 난독화처럼 보이지만, 기본 데이터가 IBM 메인프레임 시스템의 기업 데이터일 경우, 단순히 코드가 원본 문서를 반영하도록 작성되었을 수 있습니다.IBM 데이터 형식은 1960년대로 거슬러 올라가며 스토리지를 절약하기 위해 플래그를 단어 내에서 단일 비트로 인코딩하는 경우가 많습니다.형식이 변경됨에 따라 하위 호환성을 유지하기 위해 기존 레코드의 끝에 플래그 바이트가 추가되었습니다.예를 들어 SMF 레코드의 문서에는 데이터가 입력 파일임을 판단하기 위해 3개의 다른 단어 내에서 3개의 개별 비트를 테스트하는 어셈블리 언어 코드가 표시될 수 있습니다.TCP/IP의 내부 기능에 대해서는 잘 모르지만 비트플래그도 있을 수 있어요
연산자 ^은 비트 단위 xor입니다(&, | 참조).비트 쌍의 결과는 다음과 같습니다.
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
그래서 그 표현은
( x ^ 0x1 )
x의 0번째 비트를 반전/플립합니다(다른 비트는 변경되지 않음).
x가 0x0 및 0x1 이외의 값을 가질 수 있는지 여부를 고려하십시오.x가 단일 비트 필드일 경우 0x0 및 0x1 값만 가질 수 있지만 x가 int(char/short/long/etc)일 경우 bit0 이외의 비트가 식 결과에 영향을 줄 수 있습니다.
주어진 식에 따라 bit0 옆에 있는 비트가 결과에 영향을 줍니다.
if ( 0 != ( x ^ 0x1 ) )
이 표현과 동등한 진실성을 가지며,
if ( x ^ 0x1 )
이 식은 bit0만을 검사합니다.
if( 0x1 & ( x ^ 0x1 ) )
그래서 제시된 표현은 실제로 두 가지 표현체크를 조합한 것입니다.
if( ( x & ~0x1 ) //look at all bits besides bit0
|| ( x ^ 0x1 ) ) //combine with the xor expression for bit0
작성자는 bit0만을 체크하고 이 식을 사용하려고 했습니까?
if( 0x1 & ( x ^ 0x1 ) )
아니면 작성자는 bit1-bitN과 bit0의 xor의 값을 조합할 생각이었습니까?
아무도 답을 직감적으로 얻는 방법을 설명해주지 않았기 때문에 새로운 답을 덧붙입니다.
+
-
.
^
^
.
요?0 != x - 1
★★★★★★에x
양쪽 모두:0 + 1 != x - 1 + 1
→1 != x
.
요?0 != x ^ 1
★★★★★★에x
양쪽 모두:0 ^ 1 != x ^ 1 ^ 1
→1 != x
.
좋은 답변이 많지만 좀 더 간단하게 생각하고 싶어요.
if ( 0 != ( x ^ 0x1 ) );
일단은.if 문은 인수가 0인 경우에만 false입니다.이는 0과 같지 않은 비교가 무의미하다는 것을 의미합니다.
if ( a != 0 );
// Same as
if ( a );
그러면 다음과 같은 일이 생깁니다.
if ( x ^ 0x1 );
XOR와 함께.XOR의 기능은 본질적으로 다른 비트를 검출하는 것입니다.따라서 모든 비트가 같은 경우 0이 반환됩니다.0이 false이므로 false를 반환하는 것은 모든 비트가 같은 경우뿐입니다.따라서 주장이 같으면 거짓이 되고, 다르면 진실입니다.연산자와 동등하지 않은 것처럼요
if ( x != 0x1 );
이 둘의 은 '이것'이라는이다.!=
는 0하고 0은 1을 반환한다.^
는 임의의 번호를 반환하지만 결과의 정확도는 항상 동일합니다.쉽게 생각할 수 있는 방법은요.
(b != c) === !!(b ^ c) // for all b and c
는 '간단화'를 '간단화'로 변환하는 입니다.0x1
10부터 입니다.따라서 귀하의 진술은 다음과 같습니다.
if ( x != 1 )
여기서 사용될 수 있는 표준 기법은 산술적으로 단순하지만 문맥상 의미가 없는 관용어로 대체하여 난독화하는 것이 아니라 명확성을 위해 주변 문맥에서 나타나는 관용어를 그대로 반복하는 것입니다.
는 자주 할 수 .(x ^ 1)
또는 테스트에서 "비트0이 반대로 되어 있으면 이 비트마스크는 비어있을까?"라고 묻는 경우가 있습니다.
무언가가 encode()
의되어 있는 또, 어느 가 디폴트 제로)로부터 벗어난 만, 를 부호화할 가 있습니다.ed, 「0」은 「0」으로 되어 있습니다.또한 비트 중 하나가 디폴트(올제로)에서 벗어난 경우 추가 정보만 부호화할 필요가 있습니다.
문맥에서 벗어난 표현으로 무엇을 하는지 묻는다면, 당신은 근본적인 의도를 간과하는 것입니다.컴파일러의 어셈블리 출력을 보면 단순히 1과 직접 동등하게 비교되는 것을 알 수 있습니다.
^은 비트 단위 XOR 연산자입니다.
x = 1인 경우
00000001 (x) (decimal 1)
00000001 (0x1) (decimal 1)
XOR 00000000 (0x0) (decimal 0)
여기서 0 == ( x ^ 0x1)
x = 0인 경우
00000000 (x) (decimal 0)
00000001 (0x1) (decimal 1)
XOR 00000001 (0x1) (decimal 0)
여기서 0!= (x^ 0x1)
a 또는 b의 진실 표:
a b a xor b
----------------------------
1 1 0
1 0 1
0 1 1
0 0 0
암호는 단순히
XOR는 C# 플래그 열거에 도움이 됩니다.열거값에서 단일 플래그를 제거하려면 xor 연산자를 사용해야 합니다(여기에서 참조).
예:
[Flags]
enum FlagTest { None 0x0, Test1 0x1, Test2 0x2, Test3 0x4}
FlagTest test = FlagTest.Test2 | FlagTest.Test3;
Console.WriteLine(test); //Out: FlagTest.Test2 | FlagTest.Test3
test = test ^ FlagTest.Test2;
Console.WriteLine(test); //Out: FlagTest.Test3
밖에도 요.x
는 하위 비트만 설정되어 있는지 테스트하기 위한 것입니다.문맥에서는 이따라서 이것과 관련된 일부의 부호화가m
(부호화 비용이 더 많이 드는 경우)는 생략할 수 있습니다.이는 둘 다 기본값이어야 하며 컨스트럭터 등에서 초기화되어야 하기 때문입니다.
어떻게든 디코더는 이러한 값이 누락되어 있다고 추론할 수 있을 것입니다., 은 것들들 、 것것 a 、 a a a a a a a a a a a a a a a a a a a a a a a를 할 수 .length
항상 존재하는 가치
으로 보면, 간단한 .XOR
, 「무엇」을 참조해 주세요.^
★★★★★★★★★★★★★★★★★」0x
if
, , , , 입니다.!=
) 。0 != (x^1)
과 수정할 수 있습니다.(a^a)==0
:
0 != (x^1) <=> [xor left and right side by 1]
(0^1) != (x^1^1) <=>
1 != x
언급URL : https://stackoverflow.com/questions/20679642/what-does-x-0x1-0-mean
'programing' 카테고리의 다른 글
라우터에서 ASync/Awit가 예상대로 작동하지 않습니다.교도소에 있는 각 간수들 전에? (0) | 2022.08.10 |
---|---|
NULL, '\0'과 0의 차이점은 무엇입니까? (0) | 2022.08.10 |
Eclipse가 "Java was started but exit code = 1" 오류 메시지를 반환합니다. (0) | 2022.08.10 |
vue typescript 클래스 구성 요소와 vueraggable (0) | 2022.08.10 |
정적 로컬 변수로 포인터를 반환하는 것은 안전합니까? (0) | 2022.08.10 |