공통

2진법 이해하기

iseohyun 2022. 5. 3.

목차

    코딩 첫 수업은 언제나 어렵습니다. 수학은 이것이 처음이자 마지막입니다.

    엔지니어들이 100% 이공계열에서 배출되지만, 막상 코딩은 이공계열 지식보다는 언어적 역량이 필요하지 않을까 싶네요. 그 만큼 이해를 못해도 상관은 없습니다.

    컴퓨터는 큰1과 작은1이 다르다고 그냥 외우셔도 상관은 없습니다만, 아이언맨을 목표로 하는 분께는 필수로 습득해야 하는 지식입니다.
    선행지식 :
    덧셈, 곱셈, 음수, 지수(10^(-1)=?)

    학습목표 : 
    2진법 110.11을 10진법으로 바꿀 수 있습니다.
    컴퓨터가 음수를 취급하는 방법을 이해합니다.

     

    2진수란? 진법이란?

    0과 1만 사용하는 숫자체계를 2진수라고 합니다. 
    3진수는 0, 1, 2를 이용하는 숫자입니다. 
    10진수는 0부터 9까지 이용하는 숫자입니다.
    11진수는 0~9에 한 가지 문자를 더 한 숫자입니다. 통상적으로 11번째 문자는 a를 사용합니다.

    표기 법
    2진수 11 → 11(2)
    8진수 52 → 52(8)
    16진수 15 → 15(16)

     

    그러면 2진수로 아주 큰 숫자는 어떻게 표현 할 수 있을까요?
    명심하세요. 2진법은 표현법만 다를 뿐, 10진법과 같은 수학규칙 안에 있습니다. 이번 포스팅을 관통하는 가장 중요한 주제입니다. 10진수로 아주 큰 숫자를 어떻게 표현하는지 관찰해 봅시다.
     
    9보다 큰 수를 표현하기 위해 9 다음 수는 9에서 1을 더해서 10이 됩니다.
    그리고 11, 12, 13 이렇게 커지다가 19가 되면 다시 9를 0으로 바꾸고 20이 됩니다.
    같은 원리입니다.

    0 > 1 > 자리 수 올림 > 10 > 11 > 자리 수 올림 > ? > ...

      
    자리 수를 올리려고 하니 20은 2진수로 표현 할 수 없는 숫자입니다. 그러므로 100이 됩니다.
    그러면 2진수 100은 10진수에서 얼마일까요? 0부터 차근 차근 1씩 증가시키면서 따져봅시다.

    0(2) = 0(10)
    1(2) = 1(10)
    10(2) = 2(10)
    11(2) = 3(10)
    100(2) = 4(10)
    ... 다음은?

    예, 2진수 100은 10진수로 4입니다. 2진수로 표현하게 되면 자릿 수가 많이 필요할 것입니다. 10진수로 999는 3자리 밖에 되지 않지만 2진수로 바꾸면 1100100 무려 7자리나 됩니다.

     - 이해 확인용 문제
    1) 2진수 1001은 10진수로 몇 인가요?
    2) 10진수 10은 7진수로 어떻게 되나요?  
    더보기

    1) 9

    2) 13

     

     

    큰수

    만약 작은 수의 진법을 바꾸는 것은 쉽습니다. 만약 10진수 100000을 2진수로 바꿀 수 있나요?

    1234는 1000+200+30+4입니다. 그리고 1000은 10진수가 3번 중첩된 모양(10^3)이지요.
    당연히 2진법 1100도 1000+100+0+0과 같습니다.

    2진법 1000은 2가 3번 중첩된 모양(2^3=8)입니다. 즉 2진수 1000은 10진수 8입니다.
    같은 방법으로 1100을 계산해보면 8 + 4 + 0 + 0 = 12가 됩니다. 2진수 1100은 10진수로 12입니다.

    101010(2)은 얼마?
    101010(2) = 100000(2) + 1000(2) + 10(2)
    = 1 * 2^5 + 1 * 2^3 + 1 * 2^1
    = 32 + 8 + 1 = 41
    - 이해 확인용 문제
    1) 2진수 10000001은 10진수로 얼마인가요?
    2) 10진수 1000을 2진수로 얼마인가요?
    더보기

    1) 129

    2) 1000=512+256+128+64+32+0+8+0+0+0=1111101000

     

     

    곱셈

    123보다 1230은 10배 큽니다.
    9000보다 900은 10배 작습니다.

    우리는 10배 할 때마다 맨 오른쪽에 0을 붙입니다.
    0.1배 할 때는 맨 왼쪽의 0을 하나 지웁니다.

    2진수도 마찬가지입니다. 2배 할 때는 오른쪽에 0을 붙입니다. 2진수에서 11100은 1110보다 2배 큽니다.
    1110보다 2배 작은 수는 111이 됩니다.

    조금 복잡한 곱셈은 어떻게 하나요? 10배 100배가 아닌 20배 25배는 어떻게 하나요? 

    23 * 15를 생각해봅시다. 23 * 10 + 23 * 5 와 같습니다.

          2 3
    x    1 5
    ---------
       1 1 5
    + 2 3
    ---------
       3 4 5


    2진수도 마찬가지입니다. 110 * 101은 110 * 100 + 110 * 1과 같습니다.
    그러므로 답은 11000+110 = 11110입니다.

             1 1 0
    x        1 0 1
    --------------
             1 1 0
    +  1 1 0
    --------------
        1 1 1 1 0


     110 = 8, 101 = 5 이므로 11110은 40이 나와야겠죠? 16+8+4+2 = 40입니다.

    - 이해 확인용 문제
    1) 1110 * 101 = ?
    2) (6진법) 12 * 55 = ?
    (※6진법 구구단 5단을 만들어 보세요.) 5*1=5, 5*2=14, 5*3=30 ... 
    더보기

    1) 1000110

    2) 12 * 55 = 55 * 12 = 550 + 154 = 1144

     

     

    소수점 표현


    소수점표현 역시 10진법과 동일합니다.

    0.123 = 0.1 + 0.02 + 0.003 입니다.
    1 * 10^-1 + 2 * 10^-2 + 2 * 10^-3 입니다.
    마찬가지로 2진수 0.101은 0.1 + 0.001로 표현이 가능합니다.

    2진수 0.1은 1 * 2^-1이므로 1/2 즉, 0.5가 됩니다.
    2진수 0.001은 1 *2^-3이므로 1/8 즉, 0.125이 됩니다.

    0.101(2) = 0.1(2) + 0.001(2)
    = 2^(-1) + 2^(-3)
    = 0.5 + 0.125 = 0.625
    - 이해 확인용 문제
    1) 2진수 11.111은 10진수로 얼마인가요?
    2) 5진수 3.14를 10진수로 바꿀 수 있나요?
    더보기

    1) 3.875

    2) 3.14(5) = 3 + 1*5^(-1) + 4*5^(-2)
    = 3 + 0.2 + 0.04*4= 3 + 0.2 + 0.16 = 3.36

     

     

    컴퓨터는 소수점을 어떻게 저장할까요?

    1234*10^1와 1234*10^-2처럼 표현할 수 있듯이 컴퓨터는 12340와 12.34를 표현 할 때,
    1101001.101을 저장할 때 각각 1101*10^2와 1101*10^(-2)으로 인식 한 후에
     1101을 저장하고, 2-2을 각각 저장하는 방식으로 진행합니다.
     

    - 이해 확인용 문제
    1) 0.00101의 소수부와 지수부는 어떻게 되나요?
    더보기

    1) 소수부 101, 지수부 -5

    ※ 물론 정확히 말하자면, 1.01과 소수부 -3이며, 소수부에서 1은 생략(언제나 1이므로), 지수부는 127을 더 합니다. 수기로 작성할 일이 없으므로, 원리만 기억하도록 합시다.

     

    음수

    음수의 정의 -x는 x를 더했을 때 0이 되는 수라고 정의 될 수 있습니다.
    -7은 7을 더했을 때 0이 되는 수입니다. 옛날 사람들은 음수는 존재 할 수 없는 수라고 했지만 지금은 모두가 음수를 사용할 줄 압니다.
    ※ 현대 수학에서 7/0은 있을 수 없는 수로 정의되어 있습니다. 만약 0을 곱했을 때, 의미있는 숫자를 발견한다면 마이너스7처럼 철수7이라고 할 수 있을지도 모르지요.
    마찬가지로 2진수 -1110은 1110을 더 했을 때, 0이 되는 숫자입니다.

     

    컴퓨터에서 음수

    문제는 컴퓨터에 0 부호를 적을 수가 없다는 것입니다.
     
    가장 쉽게 접근 하는 방식은 가장 큰 자릿수를 -부호 비트라고 생각하는 것입니다.
    예를 들면 아래와 같습니다.

    000000001100 -> 12
    100000001100 -> -12

     

    표현하기엔 참 좋았습니다만 이를 계산하는데 어려움이 있었습니다. 덧셈기(가산기) 하나로 표현하기엔 어려움이 있습니다. 두 수를 더했을 때 0이 되지 않거든요.

    그래서 음수가 되었을 때, 모든 비트를 뒤집는 방법을 생각하게 되었습니다.

    1의 보수 표기법 : 
    000000001100 -> 12
    111111110011 -> -12

     

    이렇게 표현하면 두 수가 더해졌을 때, 1111111111이 됩니다. 0과 매우 흡사해 집니다.
    여기에 1을 더한다면 10000000000이 됩니다만 11번째 자릿수 1은 날라가버리고 0이 되버립니다.

     

    2의 보수

    애초에 1의 보수를 한 뒤에 1을 더한 수를 음수라고 해봅시다.

    000000001100 -> 12
    111111110100 -> -12

    두 수를 더했을 때, 자연스럽게 0이 됩니다.

    오늘 날 모든 컴퓨터는 2의 보수로 음수를 저장합니다. 그러면 덧셈계산기 하나로 뺄셈이 가능해집니다.
    와 2의 보수를 어떻게 생각해냈지? 천재인가? 따지고 보면 그럴 수 밖에 없는 배경이 있습니다.
     
    '더한다'라는 행위는 '다음수'를 찾는 행위입니다. 1 → 2 → 3 → 4 ... 1이 더해질 때마다 다음수로 증가하고,
    +2는 +1을 2번 더하는 행위라고 볼 수 있습니다.
    즉, 그렇다면 -1은 1을 더했을 때, 0이 되는 수를 상상 할 수 밖에 없습니다. 즉, 1111111111이 -1이 되는 것입니다.
    그러면 -2는 1을 더했을 때, -1이 되는 수가 되면 되겠군요. 즉 1111111110이 됩니다.

     

    1이랑 001이랑 틀려요?

    네, 컴퓨터의 세계에서 1과 001은 다른 수입니다.
    111은 -1인가요? 아니면 7인가요?

    컴퓨터에게 숫자를 알려줄 때엔 몇 자리수인지 알려줘야 합니다. 000111은 7이지만 111은 -1이 될 수 있으니까요.

    초기의 컴퓨터는 8자리를 기본으로 사용했습니다. 이후 16자리, 32자리로 늘어났으며, 꽤 오랜시간 동안 32자리 컴퓨터를 사용했습니다. 현재는 64자리 컴퓨터를 사용하고 있습니다.
     
    8자리로 표현 할 수 있는 가장 큰 수는 255입니다.
    16자리로 표현 할 수 있는 가장 큰 수는 65535입니다.
    32자리는 40억이 넘죠. 왜 한 동안 32자리 컴퓨터를 사용했는지 감이 오시죠? 꽤 큰수로 보이지만 4Gbyte밖에 안됩니다. 영화 한편 보기도 힘들겠네요.

     

    컴퓨터와 대화하는 방법

    컴퓨터에게 "1을 저장해"라고 하면 안됩니다.
    8자리수 1을 저장 할 것인지, 16자리수 1을 저장 할 것인지 알려줘야 합니다.

    컴퓨터에겐 1과 1.0을 바라보는 저장하는 방식이 다릅니다.
    1.0을 저장하려면 "소수점 형식으로 1을 저장해줘"라고 말해야 합니다.

    '공통' 카테고리의 다른 글

    강사의 시선  (0) 2022.02.27
    Github 관리하기  (0) 2022.01.17
    숫자 접두어 상식 : 윤달이 12월이 아니고 2월인 이유  (0) 2022.01.15
    강사자료  (0) 2022.01.10
    한글  (141) 2022.01.06

    댓글