2012. 2. 7. 22:15
Binary Codes
컴퓨터는 2진수를 사용하지만, 일련의 2진수 숫자들을 어떤 문자라든지,
혹은 0~9까지의 10진수에 1:1 mapping을 할 필요가 있을 때가 있다.
여기서는 몇 가지 binary code와 각 코드의 특징에 대해서 살펴보려고 한다.
BCD (8-4-2-1 Code)
BCD는 binary-coded-decimal의 약자다.
그다지 특별할 것이 없는 것이, 그냥 10진수를 2진수로 표현한것에 불과하다.
즉 0은 0000, 1은 0001, 2은 0010... 과 같이 표시하는 것이다.
다시말해 어떤 10진수 숫자 '459'가 있으면 '0100 0101 1001'과 같이 표시하는 것이다.
여기서 1010 부터 1111까지의 숫자들은 사용되지 않는다.
즉, malfunction이 발생해서 1010~1111의 숫자가 나오는 경우에는
error checking이 가능하다고 할 수 있다. (다만 correction은 불가능하다.)
한편 8-4-2-1은 MSB부터 LSB까지 4개의 비트에 각각 8, 4, 2, 1을 곱한 숫자가
곧 표현하고자 하는 숫자와 일치함을 의미한다.
예를 들어 1001이라면 1*8 + 0*4 + 0*2 + 1*1 = 9, 즉 9를 표현하는 숫자는 1001인 것이다.
이렇게 binary code에서 각 자리수에 어떤 가중치를 곱하고,
그 각 자리수를 더하면 우리가 표현하고자 하는 숫자가 나오는 binary code를 weighted code라고 한다.
일반적으로는 간단한 관계식이 있으면 weighted code라고 볼 수 있다.
6-3-1-1 Code
앞에서 설명한 8-4-2-1 Code에서 숫자만 바꾼 것이다.
6-3-1-1 code로 9를 표현하려면 1100이 된다.
그다지 특별할 것이 없는 binary code이고 마찬가지로 weighted code다.
Excess-3 Code
8-4-2-1 code에서 3만큼 shift 된 것이다.
즉 0은 0011, 1은 0100, 2는 0101... 과 같이, 원래 10진수에서 +3에 해당하는 2진수를 매핑한 것이다.
9를 excess-3 code로 나타내려면,
9에 3을 더한 값, 12를 2진수 변환하면 되는 것이다. (=1100)
2-out-of-5 code
특이하게 5bit를 사용한다. bit를 하나 더 쓴다는 측면에서는 손해다.
0~31까지의 2진수 중에서 1을 2번만 쓰는 모든 숫자들을 사용한 것이 2-out-of-5 code가 되겠다.
즉, 0은 00011이고 1은 00101, 2는 00110 순으로 나열되는 식이다.
일반적인 2진수라면 00110 다음에는 00111 01000 01001 ... 과 같이 되겠지만
이 중 1이 2개 포함된 것은 01001이므로, 3에 해당하는 2-out-of-5 code는 01001이 되는 것이다.
이런 식으로 하면 9는 11000에 매핑이 된다.
나름대로는 규칙성이 존재하지만 weighted code라고 할 수 없다.
이 코드를 사용함으로써 위에서도 언급되었던 malfunction의 검출이 가능하다.
즉, 1이 2개가 아닌 경우에는 malfunction이 일어났다고 볼 수 있다.
(물론, 일정한 오류 확률을 가진 device나 communication에서
1이 2개라고 해서 이것이 100% 올바른 값이라고 말할 수는 없다.)
Gray Code
여기서의 Gray는 '회색'이 아니라 Gray code를 고안한 사람 이름이다. (대문자로 써야 한다.)
인접한 숫자간에는 항상 1개의 bit를 바꾼다.
0부터 9까지의 Gray code를 써보면,
0000, 0001, 0011, 0010, 0110, 1110, 1010, 1011, 1001, 1000 이다.
인접한 숫자 간에는 bit의 변화가 항상 단 하나의 bit에서만 일어난다.
즉, 연속된 숫자를 표현할때 두세개가 아닌 하나의 bit의 변화 만으로도 인접한 숫자로 이동할 수 있는 것이다.
Gray code의 효율성은 communication에서 극명히 드러나는데,
여기서는 communication에 대해서 다루고자 하는 것이 아니므로
인접한 숫자간에 차이가 없을 수록 데이터 전송 에러율이 줄어든다는 정도의 설명만 하고 넘어가겠다.
숫자 뿐 아니라 문자도 binary code mapping을 할 수 있으나 (ASCII, EBCDIC 등) 여기서는 다루지 않겠다.