컴퓨터는 모든 데이터를 비트(bit) 단위로 표현하고 처리한다.
비트 단위 연산(bitwise operation)을 통해 사용되는 메모리 공간을 줄이거나, 성능의 향상을 기대할 수 있다.
비트(bit)란?
0
이나 1
의 값을 가질 수 있고, 각각은 참 / 거짓 혹은 서로 배타적인 상태를 나타낸다.
바이트(byte)란?
비트가 여러 개 모인 것으로 원래는 크기가 명확히 정해져 있지는 않다. 그렇지만, 일반적으로 8bit
가 1byte
다.
비트 연산자(bitwise operator)란?
비트 AND 연산자(&)
: 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다.
0 & 0 => 0
0 & 1 => 0
1 & 0 => 0
1 & 1 => 1
비트 OR 연산자(|)
: 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환한다.
0 | 0 => 0
0 | 1 => 1
1 | 0 => 1
1 | 1 => 1
비트 XOR 연산자(^)
: 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다.
0 ^ 0 => 0
0 ^ 1 => 1
1 ^ 0 => 1
1 ^ 1 => 0
비트 NOT 연산자(~)
: 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환합니다.
0 ~ 1
1 ~ 0
비트 단위(bitwise) 연산자
는 변수 내의 비트(bit)를 조작한다.과거에는 메모리가 비싸서 컴퓨터는 메모리를 많이 가지고 있지 못했기 때문에 사용 가능한 메모리를 모두 사용하려고 하는 시도가 있었다.
boolean 자료형의 경우, true와 false는 1비트 하나만 사용하지만 1bite(8bit)나 차지한다. 메모리의 가장 작은 메모리 단위는 1바이트 이기 때문인데, 이는 1비트를 사용하고 7비트를 낭비하게 된다.
bitwise 연산자를 사용하면 8개 boolean 값을 한 개의 1바이트 boolean 변수에 압축하여 넣을 수 있으므로 메모리를 절약할 수 있다.
오늘날에는 하드웨어 발달로 유지 보수가 쉬운 코드를 코딩하는 것이 더 좋다. bitwise 연산자는 최적화가 필요한 특정 상황을 제외하고는 잘 쓰이지 않는다.
(Ex. 방대한 데1이터를 사용하는 프로그램, 속도를 위해 비트 연산이 필요한 게임, 내장 메모리가 작은 하드웨어)
1bit = (0, 1) = 2의 1제곱 = 2
2bit = (0, 0)(1, 1)(0, 1)(1, 0) = 2의 2제곱 = 4
3bit = (0, 0, 0,)(0, 0, 1)(0, 1, 0)(0, 1, 1)(1, 0, 0)(1, 0, 1)(1, 1, 0)(1, 1, 1) = 2의 3제곱 = 8
1bit = 2의 1제곱 = 2
2bit = 2의 2제곱 = 4
3bit = 2의 3제곱 = 8
4bit = 2의 4제곱 = 16
5bit = 2의 5제곱 = 32
6bit = 2의 6제곱 = 64
7bit = 2의 7제곱 = 128
8bit = 2의 8제곱 = 256 = 1byte
16bit = 2byte
24bit = 3byte
32bit = 4byte
컴퓨터는 ASCII 코드를 이용해 8비트 숫자열과 문자 하나씩을 짝지을 수 있다. 총 256개의 문자만 표현할 수 있다.
ascil 사이트
한글은 어떻게 표현할 수 있을까? 256가지의 문자만을 표현할 수 있는 ASCII 코드로는 표현이 불가능하고, 좀더 확장된 코드표가 필요하다. 많은 나라에서 ASCII 코드를 확장하여 각 나라의 문자를 표현하는 방법을 강구한 결과, 그 해결책이 바로 유니코드이다.
데이터가 인코딩 방식에 따라 다르게 보이는 문제를 해결하기 위해서 “모든 문자에 유일한 값을 배정하자”는 개념이다.
이 유니코드에서는 한 문자를 표현하는 데 더 많은 비트가 필요하게 된다. 그래서 텍스트 파일을 유니코드(UTF-16)로 저장하면, (거의) 모든 문자는 2바이트씩 할당된다.
utf-8 은 ascil 과 unicode를 포함한다
개념 정리