'C언어'에 해당되는 글 1건
-
2008/05/26
비트연산자와 비트필드의 사용법 (2)
C언어에서 비트 단위의 조작을 위해서는 몇가지 비트연산자를 사용한다.
비트 단위 논리곱을 위해서는 & 연산자를 사용하는데 예제를 보면 아래와 같다.
(1001 0011) & (0011 1101) == (0001 0001)
둘다 1인 비트의 경우만 1이 되는 방식이다.
비트 단위 논리합은 | 연산자를 사용한다.
(1001 0011) | (0011 1101) == (1011 1111)
둘중 하나라도 1인 비트인 경우 1이 된다. 역으로 생각하면, 둘다 0이 아니면 1이 되는 방식이다.
비트 단위 배타적 논리합은 ^ 연산자를 사용한다
(1001 0011) ^ (0011 1101) == (1010 1110)
예제를 보면 알겠지만, 배타적 논리합이란 두 비트의 값이 같을 경우 0, 다를 경우 1이 되는 방식이다.
위의 몇가지 연산자를 이용하여 마스크, 비트On, 비트Off 혹은 비트토글 등의 방법을 사용해서 비트 단위의 처리를 하게된다. 물론, 시프트 연산자(<< , >>)를 사용해서 비트를 이동시키는 방법도 있다.
지금부터 설명할 방법은 비트 필드(bit field)를 사용하여 비트를 조작하는 방법이다. 비트 필드는 int나 unsigned int에서 서로 이웃하는 비트들의 모임을 말한다. 비트 필드는 구조체 정의를 사용해서 만들 수 있다. 이 때 각 필드에 이름을 붙여 주고 그 크기를 결정하게 된다. 예를 들어보면 아래와 같다.
struct{
unsigned aaa : 1;
unsigned bbb : 1;
unsigned ccc : 1;
unsigned ddd : 1;
} test;
위와 같은 형태의 정의는 1비트짜리 필드 4개를 만든다.
변수 test는 1비트짜리 필드 4개로 구성되며, 아래와 같이 일반적인 구조체 멤버 연산자를 이용해서 각 필드의 값에 접근할 수 있다.
test.aaa = 0;
test.bbb = 1;
test.ccc = 0x1;
test.ddd = 0x0;
위에서 만든 비트 필드는 1비트짜리 필드 4개로 구성되어있지만 사용자의 용도에 따라 비트수나 필드의 갯수를 조절 할 수 있다. 아래는 비트필드를 이용하는 간단한 예제 소스코드이다.
===============================소스코드================================
#include<stdio.h>
#include<stdlib.h>
typedef struct bit_field{
unsigned f1 : 1;
unsigned f2 : 2;
unsigned f3 : 3;
unsigned f4 : 4;
}bit_field;
void main()
{
bit_field bf;
bf.f1 = 0x01; // 10진수 1
bf.f2 = 0x03; // 10진수 3
bf.f3 = 0x07; // 10진수 7
bf.f4 = 0x0f; // 10진수 15
printf("%d\n", bf.f1);
printf("%d\n", bf.f2);
printf("%d\n", bf.f3);
printf("%d\n", bf.f4);
}
========================================================================