비트 마스킹이란?
저는 C 프로그래밍에 익숙하지 않아서 비트 마스킹을 경험했습니다.비트 마스킹의 일반적인 개념과 기능에 대해 설명해 주실 수 있습니까?예시는 대단히 감사합니다.
마스크는 유지할 비트와 지울 비트를 정의합니다.
마스킹은 값에 마스크를 적용하는 행위입니다.이것은, 다음의 조작에 의해서 실현됩니다.
- 값의 비트 서브셋을 추출하기 위한 비트 단위 ANDING
- 값의 비트 서브셋을 설정하기 위한 비트 단위 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]
즉, 중간 4비트만 (이 비트들은)1
이 마스크에서는)
이걸 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]
언급URL : https://stackoverflow.com/questions/10493411/what-is-bit-masking
'programing' 카테고리의 다른 글
소품 기본값(VueJ)에서 이 / VM 인스턴스에 액세스 (0) | 2022.07.11 |
---|---|
첫 번째 인스턴스에서만 문자열 분할 - java (0) | 2022.07.11 |
Joda-Time: 기간, 간격 및 기간의 차이점은 무엇입니까? (0) | 2022.07.11 |
Vue.js 이벤트를 컴포넌트 체인으로 전파하는 방법 (0) | 2022.07.11 |
IIS 서버에서 Vue 2 애플리케이션을 구성하는 방법 (0) | 2022.07.11 |