[아두이노] 2진수 계산법 암기

IOT/아두이노|2019. 3. 26. 09:00

[아두이노] 2진수 계산법 암기 



오늘은 간단히 진법 변환에 대해 살펴보도록 하겠습니다.

1. 10진수


123(10진수) => 우리가 사용하는 정수입니다.
123의 10진수 :


2. 2진수 변환


123을 2진수로 변환 : 123을 2로 나눈 나머지를 나열하는 숫자인데 화살표 방향으로 순서대로 나열하시면 됩니다. 이 과정은 2보다 작은 숫자가 나올때까지 나누게 됩니다.


123(10진수)가 1111011(2진수)로 표현됩니다. 마지막 2보다 작은 숫자가 나올때 그 몫도 포함해서 역순으로 순차적으로 나열하시면 됩니다. 처음 나눈 나머지는 오른쪽 첫번째 입니다.

1111011(2) 값을 다시 10진수 변환


1111011(2)를 10진수로 변환을 통해 2진수 값이 정확히 표현 되었는지 확인 과정이 필요하겠죠.


2진수 숫자를 다시 10진수화를 통해 정상적으로 계산된 것을 확인 하셨죠. 여기서 숫자가 규칙적으로 증가하는 것을 느끼셨을 거에요.


2의 몇승으로 이렇게 순차적으로 증가합니다. 그래서 2진수 계산 할 때 해당 위치에 값이 1이면 2의 자릿수승값으로 계산하시면 쉽게 암산이 가능합니다.

가령, 1101(2) 수가 있으면 오른쪽 자리부터 순서대로 해당 위치값이 1인 자리에 2의 자릿수 승값을 다 더해주면 됩니다. 이렇게 '1+4+8=13' 표현 하시면 됩니다.

10진수와 2진수 변환을 이제 쉽게 할 수 있겠죠.

2진수 소수점 변환


예) 0.125(10) 10진수가 있을때 2진수로 변환은 계속 곱하기 2을 해주면 됩니다. 그리고 소수점 이상 반올림 한 숫자는 버리기고 다시 2를 곱해줍니다. '1.0'이 될때까지 계속 소숫점 수에다 2를 곱해줍니다. 그리고 반올림한 숫자가 '0' or '1'이 나오는데 순서대로 나열하시면 됩니다.


위 그림처럼 0.25에서 '0'을 0.5에서 '0'을 1.0에서 '1'을 취합니다. 정수일때는 역순으로 나열하지만 소수점일때는 정순으로 나열합니다. 그래서 '001' 이 나오게 됩니다.

0.001(2) 값을 다시 10진수로 변환



위 표처럼 계산이 이루어지고 원래의 십진수 '0.125' 가 나오는 것을 확인이 되시죠. 여기서도 숫자의 규칙이 있습니다. 아래의 표처럼 반대로 2의 -몇승으로 증가합니다.


숫자가 2의 –4승까지는 잘 외워지는데 그 담부터 햇갈리실꺼에요. 0.5에서 –1승씩 증가할 때마다 0.5를 곱해준다고 생각하시면 됩니다.

종합)

123.125라는 10진수가 있다면 이 수를 2진수로 변환 하시오?

어떻게 할까요. 소수점을 기준으로 둘을 나눠서 계산하시면 됩니다.


3. 왜! 2진수를 배워야 하느냐!


아두이노를 다루다 보면 아누이노우노에 저장할 수 있는 공간이 그리 많지 않습니다. 단순한 표현은 그냥 해도 되지만 좀 복잡한 로직을 설계하다보면 자원공간이 부족합니다. 그렇게 때문에 최대한 효율적으로 코딩이 필요할 때 사용하기 아주 좋습니다.

예를 들어, LED 8개를 제어 한다고 생각해보죠. '1'은 HIGH, '0'은 LOW라고 할때

byte LED[8] = {1,1,0,0,1,0,0,1};

이렇게 표현하면 1byte 저장공간이 총 8byte의 공간이 필요합니다. 하지만 이걸 2진수로 이용한다면 어떻게 될까요.

byte LED = 0B11001001;

이렇게 1byte로 표현이 가능해집니다. 왜! 2진수를 배워야 하는지 이해를 하셨죠.

그리고, 패턴을 길게 만들거나 코딩이 표현하기 복잡할 때 2진수로 오히려 편하게 표현이 되는 경우가 있습니다. 그럴때 활용하기 위해서 2진수를 배워두셔야 합니다. 그리고 2진수로 코딩하다보면 좀 타이핑 글자수가 늘어날 수 있는데 그게 불편할 때는 10진수나 16진수로 변환해서 표현해도 됩니다. 다 같은 값을 가리키고 저장하기 때문입니다. 아두이노가 알아서 2진수값으로 해독하니깐요. 우리가 시각적인 눈으로 10진수 형태로 보는 것일 뿐 아두이노는 2진수 형태로 전류의 on/off로 해독하기 때문에 신경 쓸 필요가 없습니다.

4. 8진수와 16진수


계산법은 동일합니다. 8의 몇승이든 16의 몇승이든 자릿수에 맞춰서 계산하면 됩니다. 여기서 16진수만 알아 두시면 좋습니다.

우선, 알아두어야 할 것은 BCD(8421) 코드표입니다. 숙지하셔야 합니다.


BCD 8421 코드표는 "0001 + 0001 = 0010" 이렇게 숫자가 덧셈으로 반올림 된다고 생각하시면 돼요.

그리고 이것을 어떻게 다 외우냐고 하실 수 있습니다. 컴퓨터관련 학과에서 처음 공부할때 암기하는 표입니다. 그냥 외우시면 안외워집니다. 간단히 자릿수 2진수 "0001, 0010, 0100, 1000" 이렇게 해당된 자리만 암기하시면 됩니다. {1, 2, 4, 8} 어디서 많이 본 숫자의 규칙이죠. 2진수의 2의 승의 차릿수입니다. 가령 8은 '1000' 앞 뒤자리는 0111과 1001이겠죠 7과 9가 됩니다. 이런식으로 4개의 2진수 규칙을 숙지하고 전후자리의 값으로 더하고 빼주면 쉽게 숫자로 표현이 가능합니다.
그리고, '1010' 부터는 'A' 알파벳 시작이라고 생각하고 몇자리 안되니깐 더해주시면 됩니다.

8진수, 16진수 변환법


00110001(2) 이진수가 있습니다. 8진수, 16진수로 변환할려면 아래 표처럼 묶어서 계산하시면 아주 쉽게 변환할 수 있습니다. 2진수로 표현하면 어느 진수로든 쉽게 변환이 가능합니다.


여기서 참고하실것은,


이렇게 진수값 앞에 기호를 표기해야지 컴퓨터가 2, 8, 16진수구나 하고 해독합니다.

결과


'0B00110001(2)', '061(8)', '0x31(16)'로 표현이 결과가 49라는 10진수 값이 출력되는 것을아래 그림에서 컴파일 된 그림으로 확인하시거나 ideone 사이트 가셔서 직접 그 결과가 나오는지 코딩해 보세요. 다른 값들로 표현해보시는 것도 좋겠죠.


마무리


오늘 포스팅은 수학시간이 된 것 같네요. 컴퓨터 전공하면 젤 먼저 배우게 되는 기초 계산법입니다. 그리고, 이 기초 계산법은 가장 많이 사용하는 계산법이기도 하고요.

아두이노에서 10진수를 2진수로 표현하면 bit로 쪼개 계산에 활용하기 좋습니다. bitRead(x,n)함수로 원하는 위치의 비트 추출을 쉽게 할 수 있기 때문이지요. 그래서 활용 범위는 무척 넓습니다. 이번에 진수 계산법을 제대로 배워 두시면 아두이노에서 꽤 유용하게 써먹을 수 있을거에요.

지난시간에 배운 3x3x3 CUBE LED에서 편하게 패턴을 만들게 활용을 했죠. 7 Segment LED에서도 잘 써먹는 방식이고요. 다른곳에서도 비트값으로 제어하는 부품에서도 잘 사용하니깐 잘 알아두시기 바랍니다.

댓글()