BCD는 이진화십진코드(2진수 4비트를 묶어서 10진수 한자리를 나타내는 코드)의 약자.
따라서 BCD는 십진수로 표현하기가 쉽다. 하지만 일반적인 2진수는 10진수로 나타내는게 쉽지가 않다.
그래서 사용하는 알고리즘이 시프트 더하기 3 알고리즘, (double dabble)알고리즘이다.
이 알고리즘은 간단하게 설명하면 다음과 같다.
log2=약 0.3010 이므로 십진수 한자리를 표현하려면 약 3.33비트가 필요하다.
예를 들어 이진수 11001100을 BCD코드로 변환해보자. 대략 BCD코드가 3자리 필요할거다.
0000 0000 0000 11001100 (왼쪽으로 1비트 시프트)
0000 0000 0001 10011000 (왼쪽으로 1비트 시프트)
0000 0000 0011 00110000 (왼쪽으로 1비트 시프트)
0000 0000 0110 01100000 (BCD코드 첫째자리가 6으로 5이상이므로 3을 더해준다.)
0000 0000 1001 01100000 (왼쪽으로 1비트 시프트)
0000 0001 0010 11000000 (왼쪽으로 1비트 시프트)
0000 0010 0101 10000000 (BCD코드 첫째자리가 5로 5이상이므로 3을 더해준다.)
0000 0010 1000 10000000 (왼쪽으로 1비트 시프트)
0000 0101 0001 00000000 (BCD코드 둘째자리가 5로 5이상이므로 3을 더해준다.)
0000 1000 0001 00000000 (왼쪽으로 1비트 시프트)
0001 0000 0010 00000000 (왼쪽으로 1비트 시프트)
0010 0000 0100 00000000 (변환 끝)
이진수 11001100은 204이다. 성공적으로 변환되었다는 것을 알수 있다.
그렇다면 어떻게 이런일이 가능한걸까? 각 자리가 4비트씩 묶여있으므로 16진수로 변환해서 파악해보자.
0 0 0 CC
왼쪽으로 1비트 시프트 하는 것은 2를 곱하는 것과 같다.자연로그 ln을 구현해보자. (4) | 2008.12.03 |
---|---|
지수함수 exp를 구현해보자. (2) | 2008.11.28 |
제곱근(sqrt) 함수를 구현해보자. (3) | 2008.11.26 |
아트 코딩, 변태 코딩의 도화선 (4) | 2008.11.12 |
문자열을 정수로(DWORD보다 큰) (0) | 2008.07.09 |
DWORD보다 큰 단위의 정수 더하기 (0) | 2008.07.09 |
댓글 영역