나는 C 프로그래밍을 처음 접했고 비트 마스킹에 직면했다. 누군가 비트 마스킹의 일반적인 개념과 기능을 설명 할 수 있습니까? 예가 많이 인정됩니다.
답변
마스크는 유지하려는 비트와 지울 비트를 정의합니다.
마스킹은 값에 마스크를 적용하는 작업입니다. 이것은 다음을 수행하여 수행됩니다.
- 값에서 비트의 서브 세트를 추출하기위한 비트 AND
- 값에서 비트의 서브 세트를 설정하기위한 비트 단위 ORing
- 값에서 비트의 서브 세트를 토글하기위한 비트 XORing
아래는 값에서 비트의 서브 세트를 추출하는 예입니다.
Mask: 00001111b
Value: 01010101b
마스크를 값에 적용하면 첫 번째 (높은) 4 비트를 지우고 마지막 (낮은) 4 비트를 유지하려고합니다. 따라서 하위 4 비트를 추출했습니다. 결과는 다음과 같습니다.
Mask: 00001111b
Value: 01010101b
Result: 00000101b
마스킹은 AND를 사용하여 구현되므로 C에서 다음을 얻습니다.
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
다음은 상당히 일반적인 사용 사례입니다. 큰 단어에서 개별 바이트를 추출합니다. 워드의 상위 비트를 첫 번째 바이트로 정의합니다. 우리는이 두 개의 연산자를 사용 &
하고, >>
(시프트 오른쪽). 32 비트 정수에서 4 바이트를 추출하는 방법은 다음과 같습니다.
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
위의 연산자 순서를 전환 할 수 있으며 마스크를 먼저 수행 한 다음 시프트를 수행 할 수 있습니다. 결과는 동일하지만 이제 다른 마스크를 사용해야합니다.
uint32_t byte3 = (value & 0xff00) >> 8;
답변
마스킹 은 정보의 원하는 부분을 유지 / 변경 / 제거하는 것을 의미합니다. 이미지 마스킹 작업을 볼 수 있습니다. 이 마스킹 작업은 피부가 아닌 것을 제거합니다.
이 예에서는 AND 연산을 수행하고 있습니다. 다른 마스킹 연산자 인 OR , XOR도 있습니다.
비트 마스킹 은 부과하는 것을 의미합니다. 여기서 비트 마스킹 함께 AND –
1 1 1 0 1 1 0 1 [input] (&) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 0 0 1 0 1 1 0 0 [output]
따라서 (이 비트 1
가이 마스크에 있기 때문에) 중간 4 비트 만 남아 있습니다.
XOR로 이것을 볼 수 있습니다 –
1 1 1 0 1 1 0 1 [input] (^) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 1 1 0 1 0 0 0 1 [output]
이제 가운데 4 비트가 뒤집 힙니다 (1
되었고 0
, 0
이되었다 1
).
비트 마스크를 사용하여 개별 비트에 액세스 할 수 있습니다. 예 ]. 때때로이 기술은 성능 향상을 위해 사용될 수도 있습니다. 이것을 예로 들어 봅시다.
bool isOdd(int i) {
return i%2;
}
이 함수는 정수가 홀수 / 짝수인지 알려줍니다. 우리는 비트 마스크를 사용하여 더 높은 효율로 동일한 결과를 얻을 수 있습니다.
bool isOdd(int i) {
return i&1;
}
간단한 설명 : 이진수의 최하위 비트1
가 홀수이면 홀수입니다. 에 대한 0
그것도있을 것입니다. 그래서 수행하여 AND 와 1
우리가 최하위 비트 즉 제외한 다른 모든 비트를 제거 :
55 -> 0 0 1 1 0 1 1 1 [input] (&) 1 -> 0 0 0 0 0 0 0 1 [mask] --------------------------------------- 1 <- 0 0 0 0 0 0 0 1 [output]