시프트 연산자와 비트연산자 step_1
일반적으로 비트는 0 또는 1을 저장할 수 있는 공간이다. 예를 들면 전등을 제어하려고 한다. 전등은 키는 동작 그리고 끄는 동작이다. 전등은 이 두 가지로 제어할 수 있다. 문자 그대로 "켜지다, 꺼지다" 이렇게 제어하면 문자열을 처리해야 하기 때문에 보통 0이면 끄는 동작 1이면 키는 동작으로 우리는 약속하고 있다.
이러한 상황에서 우리는 0과 1을 비트로 제어할 수 있다.
그러나 비트연산자를 잘 모르면 자료형 중에서 가장 작은 단위인 char(1바이트==8비트)를 사용해서 0과 1을 대입하여서 전등을 제어할 것이다. 물론 전등이 1개만 있는 경우에는 괜찮지만 800개의 전등이 있을 시 char로 전등을 제어하면 800바이트를 사용할 수밖에 없다.
그러나 비트로 전등을 제어하면 100바이트로 전등을 전부 제어할 수 있기 때문에 메모리 용량을 효율적으로 제어할 수 있다. 그래서 비트 단위로 어떠한 행위를 제어하고 싶으면 반드시 시프트 연산자와 비트 연산자를 알아야한다.
비트 연산자를 자유자재로 바꾸고 싶다면 아래 표를 꼭 기억하자
2진법->16진법 변환 표
0000: 0 | 0100: 4 | 1000: 8 | 1100: C(12) |
0001: 1 | 0101: 5 | 1001: 9 | 1101: D(13) |
0010: 2 | 0110: 6 | 1010: A(10) | 1110: E(14) |
0011: 3 | 0111: 7 | 1100: B(11) | 1111: F(15) |
예를 들어 부호 없는 1바이트 data 변수를 선언하고 그 변수에 16진수 값 5A로 초기화하는 코드는 아래와 같다.
unsigned char data=0x5A; //16진수를 표시할 때는 앞에 0x를 반드시 붙여야한다.
그리고 16진수 한 자리는 4비트를 의미하기 때문에 아래와 같이 1바이트(8비트) 크기의 data 변수는 4자리씩 나뉜 2진법으로 표현한다.
비트를 그림으로 그려서 설명할 때 비트 번호는 아래 그림처럼 오른쪽에서 왼쪽으로 갈수록 비트 번호가 커진다.