"(int) 값 & 0x1, (int) 값 & 0x2, (int) 값 & 0x4, (int) 값 & 0x8"은 무엇을 의미합니까? "


11

암호

"값"의 범위는 0에서 15까지입니다 (가능한 값). 이 4 가지 "만약"조건은 언제 충족됩니까? 내 (int) 값 = 2이면 0010을 의미합니까?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
그있는 비트 마스크 의 개별 비트 검사 value(읽기 if(value & 0x4)"의 3 비트이기 때문에 value당신이 겉으로 코드를 이해하는데 문제가있는 것처럼 세트 (= 1))., 나는 당신없는 가정합니다. 당신이 요구되지 않습니다이 (그리고 사실을 검토를 위해)이 질문을 CR.SE의 주제로 만듭니다 .
Nobody

이해를 돕기 위해 C #으로 포팅 된 유사한 코드는이 Enum.HasFlag방법을 사용하여 비트를 테스트합니다. Enum.HasFlag를 참조하십시오 .
rwong

답변:


12

각각의 숫자는 value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...각각의 b가 0또는 1(이것은 표현의 비트 임) 인 것처럼 표현 될 수있다 . 이것은 이진 표현입니다.

이진 AND ( &)는 각 b쌍을 현명하게 취하여 AND를 수행합니다. 다음과 같은 출력이 있습니다.

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

2의 거듭 제곱 (단일 비트 만 있음)을 사용하여 개별 비트를 분리하고 테스트 할 수 있습니다.

  • value & 1value홀수 {1, 3, 5, 7, 9, 11, 13, 15} 일 때 참 입니다.

  • value & 2value/2홀수 {2, 3, 6, 7, 10, 11, 14, 15} 일 때 참 입니다.

  • value & 4value/4홀수 {4, 5, 6, 7, 12, 13, 14, 15} 일 때 참 입니다.

  • value & 8value/8홀수 {8, 9, 10, 11, 12, 13, 14, 15} 일 때 참 입니다.

숫자의 0x 프리 펙스는 16 진수 로 해석되어야 함을 의미합니다 . 0x8까지 올라갈 때 약간 불필요하지만 관리자에게 비트 마스크로 사용된다고 알려줍니다.


1
이 문구는 모든 숫자로 확장 될 수 있음을 암시 할 수 있습니다. 이는 사실이 아닙니다. 8/6홀수이지만 8&6거짓을 나타냅니다.
Sjoerd

@Sjoerd 그것이 내가 "2의 힘"이라고 말한 이유
래칫 괴물

5

이러한 if 문은 특정 비트 value가 설정되어 있는지 확인합니다 .

0x4예를 들어 16 진수 값 은 오른쪽에서 3 번째 비트를 설정 1하고 다른 모든 비트는으로 설정합니다 0. &2 개의 피연산자와 2 진 및 연산자 ( )를 사용하면 결과는 0두 피연산자 모두에서 1 인 비트 를 제외한 모든 비트가 설정됩니다 .

따라서 계산을 수행 할 때 세 번째 비트 가 또는 아닌지에 따라 value & 0x4이진 00000000또는 이진을 얻게 됩니다. 처음에 평가하여 , 그리고 두 번째 는 IF 블럭은 단지 3 비트가 설정 값에 대해 실행되도록.00000100value10falsetrue


1

여기서 주목해야 할 두 가지 흥미로운 점이 있습니다.

첫째, 이것은 정수 값의 하위 4 비트 각각을 검사하기위한 공통 패턴입니다. 해당 비트가 설정되면 if 조건이 충족됩니다. 값 2의 경우 비트 패턴은 실제로 0010입니다.

또 다른 흥미로운 질문은 왜 (int)캐스트인가? C ++에서 C 캐스트를 사용하는 나쁜 스타일 외에도 정수 또는 문자 값에는이 캐스트가 필요하지 않습니다. bool은 의미가 없으며 double / float는 정수 임시로 변환되며 리터럴 값을 사용하여 열거 형을 테스트하는 것은 일반적이지 않습니다. 포인터로 이해하는 것이 좋지만 매우 전문적인 용도입니다. 결론 : 캐스트는 의미가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.