[ 비트 설정 ] |
||||||||||||
▶ 특정 비트를 1로 설정 : 1과 |(or)연산. ▷ 5번 비트를 1로 설정>
위의 연산을 코드화 : a |= 0x00100000; ▷ 위의 0x001_0000은 0x1(0x000_0001)을 5번 쉬프트한 값과 같다. a |= 0x1 << 5;
▷ 5,3,2번 비트를 1로 설정>
위의 연산을 코드화 : a |= (0x1<<5)+(0x1<<3)+(0x1<<2); ▷ 3,2번 비트는 연속된 비트이기 때문에 0x3으로 묶어줄 수 있다. a |= (0x1<<5)+(0x3<<2); |
[ 비트 클리어 ] |
||||||||||||||||
▶ 특정 비트 클리어 : 0과 &연산. ▷ 1을 원하는 위치로 쉬프트하고 그 값에 대해 ~(NOT)연산을 해서 0으로 만듬. (0x0000, 0x0도 모두 0이기 때문에 0으로 자릿수를 표현할 수 없음)
▷ 2번 비트를 0으로 클리어>
위의 연산 코드화 : a &= ~(0x1<<2);
▷ 5,3,2번 비트 클리어>
위의 연산 코드화 : a &= ~((0x1<<5)+(0x3<<2)); |
[ 비트 반전 ] |
||||||||||||
▶ 특정 비트 반전 : 1과 ^연산. ( ^연산은 두 피연산자가 같으면 0, 다르면 1로 설정) ▷ 5번 비트 반전 >
위의 연산 코드화 : a ^= 0x1<<5
▷ 5,3,2번 비트 반전 >
위의 연산 코드화 : a ^= (0x1<<5)+(0x3<<2); |
[ 비트 검사 ] |
▶ 특정 비트가 0인지 1인지 검사. ▷ 5번째 비트가 0인지 1인지 검사 : a & (0x1 << 5) |
[ 비트 추출 ] |
▶ 특정 비트만 추출. ▷ [6:4] 비트만 추출하고 싶다면 : (a>>4) & 0x7 |
[ bit_macro.h ]
/* 한 비트 클리어 */ #define clear_bit(data, loc) ((data) &= ~(0x1 << (loc))) /* 연속된 여러 비트 클리어 */ #define clear_bits(data, area, loc) ((data) &= ~((area) << (loc))) /* 한 비트 설정 */ #define set_bit(data, loc) ((data) |= (0x1 << (loc))) /* 연속된 여러 비트 설정 */ #define set_bits(data, area, loc) ((data) |= ((area) << (loc))) /* 한 비트 반전 */ #define invert_bit(data, loc) ((data) ^= (0x1 << (loc))) /* 연속된 여러 비트 반전 */ #define invert_bits(data, area, loc) ((data) ^= ((area) << (loc))) /* 비트 검사 */ #define check_bit(data, loc) ((data) & (0x1 << (loc))) /* 비트 추출 */ #define extract_bits(data, area, loc) (((data) >> (loc)) & (area))
[ bit_test.c ]
#include <stdio.h> #include "bit_macro.h" void bitdisp(int c) { int i; for (i=7; i>=0; i--) printf("%1d", check_bit(c, i)? 1:0); putchar('\n'); } int main(void) { unsigned char a = 0xf0; // 11110000(₂) unsigned char b; printf("a 2진수로 출력 : "); bitdisp(a); puts("------------------------------------");
clear_bit(a, 5); /* 5번 비트 클리어 */ printf("5번 비트 클리어 : "); bitdisp(a); clear_bits(a, 0x7, 3); /* 5,4,3번의 연속 3비트 클리어 */ printf("5,4,3번 비트 클리어 : "); bitdisp(a); putchar('\n'); set_bit(a, 5); /* 5번 비트 설정 */ printf("5번 비트 설정 : "); bitdisp(a); set_bits(a, 0x7, 3); /* 5,4,3번 연속 비트 설정 */ printf("5,4,3번 비트 설정 : "); bitdisp(a); putchar('\n'); invert_bit(a, 5); /* 5번 비트 반전 */ printf("5번 비트 반전 : "); bitdisp(a); invert_bits(a, 0x7, 3); /* 5,4,3번 연속 비트 반전 */ printf("5,4,3번 비트 반전 : "); bitdisp(a); putchar('\n'); b = extract_bits(a, 0x7, 4); /* 6,5,4번 비트를 추출하여 b에 대입 */ printf("6,5,4번 비트 추출 : "); bitdisp(b); return 0; }
'Programming > C' 카테고리의 다른 글
The GNU C Library Reference Manual (0) | 2011.09.08 |
---|---|
The C Library Reference Guide (0) | 2011.09.08 |
다시 체계적으로 배우는 C언어 포인터 (0) | 2011.07.07 |
연산자 우선순위 (0) | 2010.05.05 |
매크로 (0) | 2010.05.05 |