3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?

안녕하세요~ 오늘은 BCD코드에 대해서 포스팅을 해보려고 합니다. 

[목차]

1. BCD 코드란 무엇인가?

2. 왜 8421코드란 이름이 붙었는가?

3. BCD코드 가산법

4. BCD코드 특징

5. BCD코드 장단점 정리

BCD Code란? 

BCD는 'Binary Coded Decimal'의 약자로 이걸 해석하면 '이진화 십진법'이예요. 직독직해하면 십진수처럼 코딩된 이진수, 말이 좀 어렵죠? BCD코드는 8421코드라는 다른 말도 가지고 있습니다. 

여러분들 알다시피, 컴퓨터는 0 또는 1, 요 두 글자만 사용해서 모든걸 표현해요.

우리는 10진수를 써서 수를 표현한다면, 컴퓨터의 세계는 2진수인거죠.

그런데 이 2진수는 사람이 보기 매우매우 불편합니다. 그래서 사람이 보는 화면에는 십진수로 보여주고, 내부적으로 이 10진수 값을 2진수로 바꿔서 사용해야해요. 반대로도 마찬가지! 이진수로 컴퓨터에서 투닥투닥 필요한 연산을 수행한 다음에, 결과를 다시 십진수로 변환해 사람에게 보여주는 프로세스를 거쳐야해요.

그럼 우리가 사용하고 있는 10진수를 어떻게 2진수로 표현할까? 다양한 방법론이 있는데 그 중 하나가 BCD코드입니다.

현재 데이터 통신에는 ASCII코드가 가장 많이 사용되고 있었으나, 컴퓨터 초창기때에는 BCD코드를 사용했었어요. 

그렇다고 지금 안쓰나?? 그렇지 않습니다. BCD만의 특별한 이점들 때문에 현재도 종종 필요에 따라 사용됩니다. (이는 아래에서 살펴보도록 해요) 또 초창기에는 숫자에 관련된 부분만 고안되었지만(?) 추후 문자등 더 많은 데이터를 표현할 수 있도록 여러 방법으로 확장되었습니다. 

BCD는 2진표기법의 4비트를 단위로 10진수 기수값 하나를 표현한다.
3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
BCD변환법

BCD코드는 10진수 자리수마다 1=1매칭해서 2진수로 변환하는걸말해요. 따라서 BCD코드는 10개의 코드만 갖고 있습니다.(0부터 9까지!) 따라서 필요한 bit는 4bit입니다. 

2진법과 BCD코드의 두드러진 차이점은 10부터 확 차이가 나요. 

[8bit 기준 바이너리코드와 BCD코드 비교]

10진수 Binary  BCD코드 
0 0000 0000 0000 0000
1 0000 0001 0000 0001
2 0000 0010 0000 0010
3 0000 0011 0000 0011
4 0000 0100 0000 0100
5 0000 0101 0000 0101
6 0000 0110 0000 0110
7 0000 0111 0000 0111
8 0000 1000 0000 1000
9 0000 1001 0000 1001
10 0000 1010 0001 0000
11 0000 1011 0001 0001
12 0000 1100 0001 0010
13 0000 1101 0001 0011

BCD는 하나의 자리수를 표현하는데 4bit를 쓰죠. 근데 4bit로 만들 수 있는 가짓수는 총 16개예요.

십진수 기수는 총 10개이므로 10부터 15에 해당하는 남은 6개의 표현값은 BCD에서 쓰이지 않습니다.

[4bit만으로 표현할 수 있는 코드]

4bits BCD코드 
0000 0을 표현하는데 사용
0001 1을 표현하는데 사용
0010 2을 표현하는데 사용
0011 3을 표현하는데 사용
0100 4을 표현하는데 사용
0101 5을 표현하는데 사용
0110 6을 표현하는데 사용
0111 7을 표현하는데 사용
1000 8을 표현하는데 사용
1001 9을 표현하는데 사용
1010 사용안함
1011 사용안함
1100 사용안함
1101 사용안함
1110 사용안함
1111 사용안함

8421코드?

BCD코드를 구성하는 수는 그 위치에 따라서 가중치를 가집니다. 각 자리수마다 8,4,2,1가중치를 갖기 때문에 BCD코드는 8421코드라고도 불려요. 

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?

0011의 BCD코드를 10진수로 변환하려면 어떻게 해야 하나? 각 자리수가 8421가중치를 가지고 있으므로 1이 있는데만 가중치를 더해주면 됩니다.

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
BCD를 10진수로 변환

왜 굳이 8421코드라 불르나, 다른 가중치 방법이 나왔으니까 이런 이름이 붙었겠죠!? 비교를 위해서죠 뭐 (ex 5421코드 등)

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
https://www.tutorialspoint.com/computer_logical_organization/binary_codes.htm

암튼 8421코드는 BCD코드의 다른 이름이라는거 ~

BCD코드 가산법

[문제]

바이너리코드가 아닌 BCD코드를 사용하게 되면 2진 가산법을 그대로 적용하지 못하는 문제점이 있어요. 이게 무엇인지 보고 어떻게 해결했는지 확인해봅시다. 즉! 이진법처럼 계산하시면 안돼요! 13+7을 예시로 볼게요.

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
출처: http://blog.naver.com/PostView.nhn?blogId=cni1577&logNo=221580366043&parentCategoryNo=&categoryNo=35&viewDate=&isShowPopularPosts=true&from=search

왼쪽은 10진수 13+7 계산법이고

오른쪽은 이를 BCD코드로 구현한 뒤 이진법처럼 계산한 모습입니다.

그런데 BCD코드에 1010이 있었나요??? ㄴㄴ , [4bit만으로 표현할 수 있는 코드]부분 올라가서 보고 오시면 1010은 사용하지 않아요. 

[해결]

그럼 BCD코드를 할 때 어떻게 해야할까요?

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?

9를 넘어선 값이 나오면 6에 해당하는 0110을 더해줘야 해요. [왼쪽 그림 참고]

왜 6을 더해줄까요?? 그건 이진수 특징인 4bits가 16가짓수이고, 10진수는 10개의 값만 가지기 때문에 carry를 넘기기 위해서는 6을 더해서 순환시켜줘야 하기 때문이예요.

0110(2)을 더해줘야 하는 원리 자세히 설명하기

[십진수개념에서 생각해보자: 3+7=10인 이유 분석해보기]

자, 3+7을 계산하면 캐리 1이 발생하고 나머지가 0이 남습니다. 그래서 3+7=10이 되는거예요. 즉 10은 캐리와 나머지의 조합이다.

보면 캐리가 발생하면 다음 기수로 넘어가게 돼요. 왜냐!! 10진법은 표현할 수 있는 범위가 0~9까지이기 때문 즉, 하나의 기수에 10을 표현할 수 없기 때문이예요.

[BCD개념에서 생각해보자]

8421코드도 마찬가지입니다. 이진수이긴 하지만 10진수처럼 코딩되어 있다고 했죠?? 얘도 표현할 수 있는게 0~9까지라 했어요.

자 더했더니 10 이 됐어요. 그럼 기수를 하나 넘기고 0이 되어야겠죠. 근데 이진수처럼 계산했더니 값이 1010이 나왔어요. 얘는 BCD코드에서 사용할 수 없죠. 표현할 수 있는 기수가 아닙니다. 따라서  0000으로 초기화되고 캐리로 1을 넘겨줘야겠죠

(값이 10이므로 딱 떨어져 나머지가 0이므로)

BCD코드의 처음인 0000이 됐어요. 이게 다시 처음으로 돌아가려면 몇을 더해줘야 할까요? 즉 순환하려면 어떻게 계산되어야할까요? 4bit의 특징을 생각해봅시다. 0000-> 0001-> 0010 -> 0011..등의 16개 가짓수를 다 돌아야 다시 0000부터 반복되겠죠.(순서대로 1씩 더해보세요 1111 +1 이 되어야 1+0000이 되어 뒤의 4bit가 다시 0000이 되겠죠?) 우리가 16가짓수 중10개만 사용하니까 다시 되돌아가라면 6을 더해줘야 순환이 됩니다. 따라서 사용하지 않는 값이 나오면 6을 더해주어야 제대로 된 계산이 되는거예요.  (잘 설명을 했는지 모르겠네요 ㅎㅎ ㅋㅋ)

[연습문제]

연습문제를 보는게 계산하는 법을 이해하는게 더 빠를수도!

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
17+46
3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
출처: http://blog.naver.com/PostView.nhn?blogId=cni1577&logNo=221580366043&parentCategoryNo=&categoryNo=35&viewDate=&isShowPopularPosts=true&from=search

BCD코드 특징

바이너리코드와 BCD코드의 차이점을 명확히 보기 위해 예시를 들어봅시다.

10진수: 185

방법  표현 크기
BCD코드 변환시 0001 1000 0101 12bit
바이너리코드 변환시 1011 1001 8bit 

장점1: 같은 수 체계로 유저에게 친숙

자 표현만 봤을 때 바이너리코드(1011 1001)의 경우 해당 값이 185라는걸 한번에 알 수 있겠나요??

계산을 일일이 해봐야 알 수 있어요. 10진수처럼 표현되기 때문에 사람들에게 더 친숙합니다.

장점2: 하드웨어적 구현이 굳

그리고 하드웨어 알고리즘 적으로 BCD변환기는 다른 알고리즘에 비해 구현하기 심플합니다)

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?

자리수에 해당하는 변환기하나만 있으면 되기 때문에 사람들에게 입력을 받고 또 이를 보여주는 DISPLAY하는 데에 효율적입니다.

장점3: 따라서 사용자에게 입력받고 보여줄때 효율적

컴퓨터에서는 대게의 사용자가 BCD코드 형태로 데이터를 입력하며 이 코드가 컴퓨터 내부에서 2진수로 변환되어 저장과 연산이 시행 되도록 도와줘요. BCD 표현 방식의 장점으로는 수의 크기에 제한없이 자릿 수가 증가 할 마다. 새로 4비트만 더 부가 하면 된다는거..!

장점4: ASCII보다 차지하는 크기가 작음. 

단점1: 바이너리보다 차지하는 크기가 큼 

또 크기를 보면 바이너리는 8bits인데 BCD는 12bits로 더 많은 bit를 사용합니다. 따라서 바이너리보다 high speed를 내기 어려워요.

하지만 현재 가장 많이 사용되는 ASCII코드는 1문자당, 8bits나 차지해요. 즉 185면 8*3해서 24bits! 근데 BCD는 한 문자당 4bits만 차지하니까 ASCII보다 반이나 줄게 됩니다. (1/2배)

이 특징 때문에, 현재 데이터 전송시에, 많은 데이터를 함축적으로 보내려고 ASCII -> BCD변환을 사용하기도 합니다.

장점5: 정확한 소숫점 표현

10진수 0.2를 binary code로 표현해봅시다.

그러면 0.001100110011... 의 무한한 소수값을 갖게 돼요.

그런데 이를 BCD코드로 표현하면..! 0.0010으로 매우 심플하게 표현됩니다.

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?

BCD는 부동소수점에 이점이 있기 때문에 과학적이거나 그래픽적인 계산기에서 여전히 사용됩니다.

모든 HP계산기는 BCD를 사용한다고 하네요. (2016년 검색 기준)

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?
출처: https://www.quora.com/How-much-is-Binary-Coded-Decimal-BCD-used-these-days-and-how-important-is-it-where-it-is-used

BCD코드 장단점 정리 

장점:

- 우리가 사용하고 있는 10진수 시스템과 유사하다.

- 오직 0-9에 해당하는 바이너리값만 알고 있으면 된다.

- 하드웨어 알고리즘 구현이 simple!

- 사용자로부터 입력받고 DISPLAY해줄때 좋다.

- ASCII코드보다 1/2의 크기를 차지함

단점:

- BCD코드의 경우 덧셈과 뺄셈을 수행하는 방법이 다르다.

- BCD 연산은 좀 더 복잡함 (ALU가 복잡..)

- BCD는 10진수를 표현할 때 바이너리보다 더 많은 bit가 필요하다. 

다음 관련 포스팅에서..

[C언어] 10진수 입력받아 BCD코드로 변환하기 (바이너리 -> BCD)  또는 그 반대로 변환해보기

[C언어] ASCII -> BCD , BCD->ASCII 변환하는 코드 구현 

등을 다뤄볼까 합니다.

--> 해당 포스팅을 이어서 보시려는 분은 아래 링크를 참조해주세요!

https://jhnyang.tistory.com/235

[C언어]바이너리(binary)에서 BCD코드로 또는그 반대로 변환하기, 아스키코드<->BCD코드 변경 구현하기

안녕하세요 주인장입니다. 저번시간에 BCD코드 개념에 대해서 살펴봤다면 오늘은 실질적인 코드를 작성해볼게요! 저번시간 포스팅이 궁금하다면! https://jhnyang.tistory.com/232 [BCD,8421코드 총정리]BCD코드는..

jhnyang.tistory.com

3초과 코드는 어떻게 구성하는가? - 3chogwa kodeuneun eotteohge guseonghaneunga?

저도 배운지 오래되어 구글링으로 검색을 많이 이용합니다. 따라서 포스팅에 실수나 틀린 부분이 있을 수 있어요. :)

오늘은 여기까지입니다. 해당 포스팅이 도움이 되셨다면 좋아요, 댓글, 또는 광고보답은 어떤가요? 

정성을 들여 정보공유하는데 큰 힘이됩니다 :)