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 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 한 비트 클리어 */
#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 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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