programing

비트 마스킹이란?

randomtip 2022. 7. 11. 22:38
반응형

비트 마스킹이란?

저는 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;
}

간단한 설명:이진수의 최하위 비트가10비길 거예요.그래서 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

반응형