본문 바로가기

Semiconductor/ETC

Double Dabble

 BCD( Binary Coded Decimal) 2진수 4비트를 묶어서 10진수 한 자리를 나타내는 코드. 따라서 BCD는 10진수로 표현하기 용이하다. 하지만, 일반적인 2진수로 10진수를 나타내기는 쉽지 않다. 그래서 사용하는 알고리즘이 shift 더하기 3 알고리즘, Double Dabble 알고리즘이다.

 

 이 알고리즘을 간단하게 설명하면 다음과 같다.

 

  1. 일반 2진수 코드를 왼쪽으로 1bit씩 shift한다.
  2. 4bits씩 묶어서 5 이상인 자리에는 3을 더해준다.
  3. 모든 bits가 왼쪽으로 shift 될 때까지 위 과정을 반복한다.

 $log2=0.3010..$이므로 10진수 한 자리를 표현하려면 약 3.33bits가 필요하다.

 예를 들어, 2진수 11001100( =204)을 BCD코드로 변환하면 약 3자리의 BCD코드가 필요 할 것이다.

 

0000  0000  0000  11001100   (왼쪽으로 1bit shift)

0000  0000  0001  10011000   (왼쪽으로 1bit shift)

0000  0000  0011  00110000   (왼쪽으로 1bit shift)

0000  0000  0110  01100000   (BCD 코드 첫째 자리가 5이상, 3을 더해줌)

0000  0000  1001  01100000   (왼쪽으로 1bit shift)

0000  0001  0010  11000000   (왼쪽으로 1bit shift)

0000  0010  0101  10000000   (BCD 코드 첫째 자리가 5이상, 3을 더해줌)

0000  0010  1000  10000000   (왼쪽으로 1bit shift)

0000  0101  0001  00000000   (BCD 코드 둘째 자리가 5이상, 3을 더해줌)

0000  1000  0001  00000000   (왼쪽으로 1bit shift)

0001  0000  0010  00000000   (왼쪽으로 1bit shift)

0010  0000  0100  00000000   (변환 완료)

 

 2진수 11001100은 204이다. 성공적으로 변환한것을 알 수 있다.

 이러한 알고리즘이 적용되는 이유는 무엇일까? 각 자리가 4bits씩 묶여있으므로 16진수로 변환해서 파악해보자.

 

0 0 0 C C , 왼쪽으로 1bit shift하는 것은 2를 곱하는 것과 같다.

0 0 1 9 8

0 0 3 3 0

0 0 6 6 0 , 6에 3을 더해준다. 왜 일까?

 

 16진수에서는 8이상의 수에 2를 곱하면 자리수 올림이 일어난다. 10진수에서는 5이상의 수에 2를 곱해야 자리수 올림이 일어난다. 따라서 5이상의 수에 3을 더해 8이상의 수로 만들어주면 2를 곱했을때 자리수 올림이 일어난다. 이런 이유로 5이상의 수에 3을 더하는 것이다.

 

0 0 9 6 0

0 1 2 C 0 

0 2 5 8 0

0 2 8 8 0

0 5 1 0 0 

0 8 1 0 0

1 0 2 0 0

2 0 4 0 0

 

0xcc = 204

'Semiconductor > ETC' 카테고리의 다른 글

Linux 명령어  (0) 2020.12.19
Decimal to Binary conversion( Decimal point)  (0) 2020.11.17
LFSR( Linear Feedback Shift Register)  (0) 2020.10.26
Carry lookahead Full Adder  (0) 2020.10.22