1. 들어가기 전에..
옛날 초창기 땐 컴퓨터는 현재와 많이 달랐습니다. 겉모양 뿐만 아니라 메모리 용량도 적었고, 가격도 비쌌습니다.
그래서 과거의 개발자들은 메모리를 조금이라도 덜 사용하는 방법을 고민합니다.
2. 예시 상황
아래 그림과 같이 집에 8개의 등이 있다고 가정합니다.

등이 켜진 것을 1, 꺼진 것을 0으로 표현한다고 합니다.
이것을 코드로 표현한다고 하면 아래와 같이 8개의 bool 로 선언해서 표시 할 수 있습니다.

이것은 일반적인 방법입니다. 위와 같은 방법으로는 총 8Byte(1 bool = 1Byte)가 됩니다.
0과 1로만 표시하는건 bool 뿐만 아니라 비트로도 표시 할 수 있습니다.
등 1개를 1비트로 표시하면 아래와 같이 1Byte만으로 표시 할 수 있습니다.

3. 비트 단위 연산자
이렇게 비트로 표시를 하게 되면 데이터를 가공할 때 비트 수준의 연산이 필요합니다.
아래 표는 비트 단위 연산자를 설명합니다.
<< | Left Shift | x = a << 3; |
>> | Right Shift | x = a >> 3; |
& | AND | x = a & 5; |
| | OR | x = a | b; |
^ | XOR | x = a ^ 3; |
~ | NOT | x = ~y; |
4. 예제
- 특정 비트 1로 만들기
아래 그림과 같이 3번째 등을 켜고 싶으면 해당 위치의 비트를 1로 변경 해야합니다.

Shift와 OR연산을 사용하면 가능합니다.
unsigned char ucDisplay = 0x89; // 1000 1001
unsigned char ucMask = 0x01; // 0000 0001
ucMask = ucMask << 2; // 0000 0100
ucDisplay = ucDisplay | ucMask; // 0000 0100

- 특정 비트 0으로 만들기
만약 3번째 등을 끄고싶으면 해당 위치의 비트를 0으로 변경해야 합니다

Shift, XOR, AND연산을 사용하면 구현 가능합니다.
unsigned char ucDisplay = 0x8D; // 1000 1101
unsigned char ucMask = 0x01; // 0000 0001
ucMask = ucMask << 2; // 0000 0100
ucMask = ucMask ^ 0xFF; // 1111 1011
ucDisplay = ucDisplay & ucMask; // 1000 1001

- 특정 비트 0 <-> 1 토글 방식 만들기
토글식으로 구현하는 방법은 Shift, XOR연산으로 가능합니다.
unsigned char ucDisplay = 0x89; // 1000 1001
unsigned char ucMask = 0x01; // 0000 0001
ucMask = ucMask << 2; // 0000 0100
ucDisplay = ucDisplay ^ ucMask; // 1000 1101
ucDisplay = ucDisplay ^ ucMask; // 1000 1001
// ...
