비트 마스킹이란 무엇입니까?
나는 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도 있습니다.
Bit-Masking means imposing mask over bits. Here is a bit-masking with 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]
So, only the middle 4 bits (as these bits are 1
in this mask) remain.
Lets see this with 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]
Now, the middle 4 bits are flipped (1
became 0
, 0
became 1
).
So, using bit-mask we can access individual bits [examples]. Sometimes, this technique may also be used for improving performance. Take this for example-
bool isOdd(int i) {
return i%2;
}
This function tells if an integer is odd/even. We can achieve the same result with more efficiency using bit-mask-
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
'IT' 카테고리의 다른 글
왜 "HTTP는 상태 비 저장 프로토콜"이라고되어 있습니까? (0) | 2020.06.05 |
---|---|
Vcode에서 Xcode5의 * .xccheckout 파일을 무시해야합니까? (0) | 2020.06.05 |
JavaScript에서 JSON 문자열을 특정 객체 프로토 타입으로 구문 분석 (0) | 2020.06.05 |
SQL WHERE .. IN 절 여러 열 (0) | 2020.06.05 |
“조건부 점프 또는 이동은 초기화되지 않은 값에 따라 다릅니다.” (0) | 2020.06.05 |