반응형
비트 마스크 (Bit Mask)
비트(Bit)는 어떤 자료를 표현하는 최소 단위로 0과 1로만 표현할 수 있습니다.
이를 사용하는 방식은 자료의 형식(숫자, 이미지, 문자 등)에 따라 다릅니다.
비트 마스크(Bit Mask)는 특정 위치의 비트 값을 알아내는 알고리즘으로 이 과정을 비트 마스킹(Bit Masking)이라고 합니다.
비트 마스킹은 C의 비트 논리 연산자 &(AND)를 이용합니다.
예를 들어 7(00000111)이라는 수의 세번째 비트 값을 구하기 위해서
아래와 같이 세 번째 비트 값만이 1인 4(00000100)를 이용하여 구합니다.
0000 0111 & 0000 0100 = 0000 0100 |
다른 예제도 살펴보면
67의 세번째 비트 | 0100 0011 & 0000 0100 = 0000 0000 | 0 |
101의 첫번째 비트 | 0110 0101 & 0000 0001 = 0000 0001 | 1 |
184의 여덟번째 비트 | 1011 1000 & 1000 0000 = 1000 0000 | 128(1) |
다음과 같이
결과 값이 0이면 그 위치의 비트 값이 0이라는 의미이고
결과 값이 0이 아니면 그 위치의 비트 값이 1이라는 의미입니다.
10진수 > 2진수 문자열 변환
이 비트 마스크(Bit Mask)를 이용하여 10진수를 2진수로 변환하는 함수를 구현할 수 있습니다.
char* bin(int dec_number) {
static char bin_str[9] = "";
int bitmask[8] = { 1, 2, 4, 8, 16, 32, 64, 128 }, i;
int bitmask_length = sizeof(bitmask) / sizeof(int);
for (i = 0; i < bitmask_length; i++) {
bin_str[bitmask_length - 1 - i] = ((dec_number & bitmask[i]) > 0) ? '1' : '0';
}
return bin_str;
}
해당 함수는 최대 8자리의 2진수(0~255)를 문자열의 형태로 출력할 수 있습니다.
char* bin(int dec_number) {
static char bin_str[길이+1] = "";
int bitmask[길이] = { 1, 2, 4, 8, 16, 32, 64, 128, ... , 2^(길이-1) }, i;
int bitmask_length = sizeof(bitmask) / sizeof(int);
for (i = 0; i < bitmask_length; i++) {
bin_str[bitmask_length - 1 - i] = ((dec_number & bitmask[i]) > 0) ? '1' : '0';
}
return bin_str;
}
더 긴 2진수를 표현하고 싶으면 다음과 같이 bitmask를 더 추가하여 변경할 수 있습니다.
printf("%d = %s\n", 123, bin(123));
// 123 = 01111011
이유는 모르겠으나 다음과 같이 한 줄에 여러 개의 bin 함수를 사용하면 논리적 오류가 발생합니다.
int x = 56, y = 123;
printf("%s + %s = %s\n", bin(x), bin(y), bin(x + y));
// 예상 출력
// 00111000 + 01111011 = 10110011
// 실제 출력
// 00111000 + 00111000 = 00111000
따라서 한 줄에 여러 개의 bin 함수를 사용하기 위해서 문자열을 저장하는 변수를 선언하여 저장 후에 사용해야 합니다.
// #include <string.h>
int x = 56, y = 123;
char x_bin[9], y_bin[9], xpy_bin[9];
strcpy(x_bin, bin(x));
strcpy(y_bin, bin(y));
strcpy(xpy_bin, bin(x + y));
printf("%s + %s = %s\n", x_bin, y_bin, xpy_bin);
// 실제 출력
// 00111000 + 01111011 = 10110011
반응형