-
반응형
0과 1 1 비트에 0 또는1 중 한 가지 값을 저장 가능
C 언어의 가장 작은 자료형은 1 Byte.
40개의 전등의 상태를 저장해야한다면, 40개의 변수가 필요
1바이트에 8개의 전등 상태를 비트로 저장 가능하기 때문에 5개의 변수로 40개의 전등 상태 저장 가능
unsigned char lamp_state = 0; // 기본값은 전등이 꺼져있음 lamp_state = 1;
비트 패턴과 16진법
C언어는 2진법 상수 표현을 제공하지 않음
2진법 대신에 소스 코드에서는 표현하기 쉬운 16진법을 주로 사용
2진법<->16진법 게시글 링크// 부호 없는 1바이트 data 변수를 선언하고 그 변수에 16진수 값 5A로 초기화 unsigned char data = 0x5A // 2진법 비트패턴: 0101 1010
시프트 연산자
변수의 값을 지정한 비트 수만큼 왼쪽(<<) 또는 오른쪽(>>)으로 비트 이동
오버플로(Overflow) : 비트가 왼쪽으로 밀려나가면서 사라지는 것
언더플로(Underflow) : 비트가 오른쪽으로 밀려나면서 사라지는 것
// 오른쪽에서 왼쪽으로 비트 이동 unsgined char data = 0x1A; // 이동 전 : 0001 1010 data = data << 2; // 이동 후 : 0110 1000 새로채워지는 부분은 0으로 채워진다.
// 왼쪽에서 오른쪽으로 비트 이동 unsgined char data = 0x1A; // 이동 전 : 0001 1010 data = data >> 2; // 이동 후 : 0000 0110 새로채워지는 부분은 0으로, 밀려난 부분은 없어진다.(Underflow)
시프트 연산자의 특성 이용하기
<< 특성 : n 개의 비트를 오른쪽에서 왼쪽으로 이동하면 2의 n승을 곱한것과 동일
>> 특성 : n 개의 비트를 왼쪽에서 오른쪽으로 이동하면 2의 n승을 나눈것과 동일
시프트 연산자는 곱셈과 나눗셈 연산자보다 연산 속도가 빠름
2의 제곱으로 곱하거나 나눌 때에만 시프트 연산자 사용 가능
시프트 연산자를 사용할 때 주의할 점
1) 연산자 우선 순위가 낮다.
int number = 3 * 4 + 5 * 8; // 위 식을 시프트 연산자로 대체 int number = 3 << 2 + 5 << 3; // +가 <<보다 연산자 우선순위가 높기 때문에 2+5가 먼저 연산됨 int number = 3 << 7 << 3; int number = (3 << 2) +( 5 << 3); // 이렇게 괄호를 활용해야 정확하게 연산 가능
2) 변수에 부호가 있는 경우
unsigned 형식으로 선언된 변수들은 시프트 연산 시 빈 공간을 0으로 채움
signed 형식으로 선언된 변수들에 >>를 사용하면 자신의 부호를 유지하기 위해 부호 비트와 동일한 값을 채움
char data = 0x85; // 10진수 –123 data = data >> 3;
부호를 유지하기 때문에, 그로 인해 부호 비트가 1이면 나머지 밀리는 값도 1로 처리됨.음수를 나누는 경우에는 >> 연산자보다 /를 사용하여 나누는 것이 좋음.
int num = -123 / 8; // num 변수에 –15가 대입 int num = -123 >> 3; // num 변수에 –16 대입 -123이 8의 배수가 아니기 때문에 1만큼 차이가 발생한 것.
2의 제곱이 아닌 숫자도 시프트 연산으로 대체할 수 있을까?
100 = 64(2^6) + 32(2^5) + 4(2^2)
a * 100 = a * 64(2^6) + 32(2^5) + 4(2^2)
= a * 64 + a * 32 + a * 4
= a * 2^6 + a * 2^5 + a * 2^2
= a << 6 + a << 5 + a << 2(연산자 우선순위)= (a << 6) + (a << 5) + (a << 2)
반응형'C' 카테고리의 다른 글
비트 연산자(AND, OR, XOR, NOT) (0) 2022.04.29 중첩 반복문(2중 for문), break, continue, 기타 반복문 (0) 2022.04.27 while 반복문 (0) 2022.04.26