2011. 7. 29. 15:34

[ 비트 설정 ]

▶ 특정 비트를 1로 설정 : 1과 |(or)연산.

▷ 5번 비트를 1로 설정>

  

0101_0101

OR( | )

0010_0000

  

0111_0101

 

위의 연산을 코드화 : a |= 0x00100000;

▷ 위의 0x001_0000은 0x1(0x000_0001)을 5번 쉬프트한 값과 같다.

a |= 0x1 << 5;

   

▷ 5,3,2번 비트를 1로 설정>

  

0101_0101

OR( | )

0010_1100

  

0111_1101

 

위의 연산을 코드화 : a |= (0x1<<5)+(0x1<<3)+(0x1<<2);

▷ 3,2번 비트는 연속된 비트이기 때문에 0x3으로 묶어줄 수 있다.

a |= (0x1<<5)+(0x3<<2);

   

[ 비트 클리어 ]

▶ 특정 비트 클리어 : 0과 &연산.

▷ 1을 원하는 위치로 쉬프트하고 그 값에 대해 ~(NOT)연산을 해서 0으로 만듬.

(0x0000, 0x0도 모두 0이기 때문에 0으로 자릿수를 표현할 수 없음)

0x1 << 5

0x0010_0000

~(0x1<<5)

0x1101_1111

▷ 2번 비트를 0으로 클리어>

  

0101_0101

AND(&)

1111_1011

  

0101_0001

위의 연산 코드화 : a &= ~(0x1<<2);

   

▷ 5,3,2번 비트 클리어>

  

0101_0101

AND(&)

1101_0011

  

0101_0001

위의 연산 코드화 : a &= ~((0x1<<5)+(0x3<<2));

   

[ 비트 반전 ]

▶ 특정 비트 반전 : 1과 ^연산. ( ^연산은 두 피연산자가 같으면 0, 다르면 1로 설정)

▷ 5번 비트 반전 >

  

1111_0101

XOR(^)

0010_0000

  

1101_0101

위의 연산 코드화 : a ^= 0x1<<5

   

▷ 5,3,2번 비트 반전 >

  

1111_0101

XOR(^)

0010_1100

  

1101_1001

위의 연산 코드화 : 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
Posted by devanix