마스크 (컴퓨팅)
컴퓨터 과학에서 마스크(mask) 또는 비트마스크(bitmask)는 특히 비트 필드에서 비트 연산에 사용되는 데이터이다. 마스크를 사용하면 바이트, 니블, 워드 등의 다중 비트들을 싱글 비트 연산 작업에서 켜고 끄거나 상호 반전시킬 수 있다.
일반적인 비트마스크 기능
비트를 1
로 마스킹
특정 비트를 켜기 위해 code>Y OR 1 = 1과 Y OR 0 = Y
라는 원리에 따라 비트연산 OR
을 사용할 수 있다. 그러므로 비트를 켜기 위해 OR
에 1
를 사용할 수 있다. 비트를 변경하지 않은 채로 내버려 두려면 OR
에 0
을 사용하면 된다.
예: 더 높은 니블(비트 4, 5, 6, 7)을 "on"으로 마스킹. 더 낮은 니블(비트 0, 1, 2, 3)은 변경되지 않음.
10010101 10100101 OR 11110000 11110000 = 11110101 11110101
비트를 0
으로 마스킹
실제로는 "on" 마스킹(1
로 마스킹)보다 "off" 마스킹(0
으로 마스킹)을 하는 일이 더 많다. 비트가 0과 함께 AND
처리될 때 결과는 무조건 0이다. (예: Y AND 0 = 0
) 원래 있던 것처럼 다른 비트들을 남겨두려면 Y AND 1 = Y
가 되므로 1
과 함께 AND
처리할 수 있다.
예: 더 높은 니블(비트 4, 5, 6, 7)을 "off"로 마스킹. 더 낮은 니블(비트 0, 1, 2, 3)은 변경되지 않음.
10100101 10100101 AND 00001111 00001111 = 00000101 00000101
해시 테이블
C에서 modulo와 masking의 예:
#include <stdint.h>
#include <string.h>
int main(void) {
const uint32_t NUM_BUCKETS = 0xFFFFFFFF; // 2^32
const uint32_t MAX_RECORDS = 1<<10; // 2^10
const uint32_t HASH_BITMASK = 0x3FF; // (2^10)-1
char **token_array = NULL;
// Handle memory allocation for token_array…
char token[] = "some hashable value";
uint32_t hashed_token = hash_function(token, strlen(token), NUM_BUCKETS);
// Using modulo
size_t index = hashed_token % MAX_RECORDS;
// OR
// Using bitmask
size_t index = hashed_token & HASH_BITMASK;
*(token_array+index) = token;
// Free the memory from token_array …
return 0;
}