나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-02-21 11:34:52

2진법

파일:Semi_protect2.svg   가입 후 15일이 지나야 편집 가능한 문서입니다.
(~ KST )

연산
Numbers and Operations
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px)"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
<colbgcolor=#765432> 수 체계 자연수 (홀수 · 짝수 · 소수 · 합성수) · 정수 · 유리수 (정수가 아닌 유리수) · 실수 (무리수 · 초월수) · 복소수 (허수) · 사원수
표현 숫자 (아라비아 숫자 · 로마 숫자 · 그리스 숫자) · 기수법(과학적 기수법 · E 표기법 · 커누스 윗화살표 표기법 · 콘웨이 연쇄 화살표 표기법 ·BEAF· 버드 표기법) · 진법 (십진법 · 이진법 · 8진법 · 12진법 · 16진법 · 60진법) · 분수 (분모 · 분자 · 기약분수 · 번분수 · 연분수 · 통분 · 약분) · 소수 {유한소수 · 무한소수 (순환소수 · 비순환소수)} · 환원 불능 · 미지수 · 변수 · 상수
연산 사칙연산 (덧셈 · 뺄셈 · 곱셈 구구단 · 나눗셈) · 역수 · 절댓값 · 제곱근 (이중근호) · 거듭제곱 · 로그 (상용로그 · 자연로그 · 이진로그) · 검산 · 연산자 · 교환자
방식 암산 · 세로셈법 · 주판 · 산가지 · 네이피어 계산봉 · 계산기 · 계산자
용어 이항연산(표기법) · 항등원과 역원 · 교환법칙 · 결합법칙 · 분배법칙
기타 수에 관련된 사항 (0과 1 사이의 수 · 음수 · 작은 수 · 큰 수) · 혼합 계산 (48÷2(9+3) · 111+1×2=224 · 2+2×2) · 0으로 나누기(바퀴 이론) · 0의 0제곱 }}}}}}}}}

진법
2진법 8진법 10진법
12진법 16진법 60진법

1. 개요2. 표현법3. 이진법을 이용한 수 표기의 예시4. BCD 코드5. 기타6. 관련 문서

1. 개요

/ binary

2진법은 0과 1이라는 두 개의 숫자만을 사용하여 를 나타내는 진법을 말한다. 미적분학의 창시자이기도 한 고트프리트 빌헬름 라이프니츠가 고안하였다.

인간은 10개의 손가락을 각각의 객체로 인지하여 펴지거나 접힌 것을 세는 셈법을 주로 써왔기에 오래 전부터 10진법을 사용해 왔지만, 전자기기의 경우는 신호를 특정 순서로 그룹화 하여 인지하기에 해당 신호가 켜졌는지(1), 꺼졌는지(0)를 구별하기 때문에[1] 2진법을 기반으로 발전하였다.

예시로 들자면, 인간은 손가락이 몇 개 펴져있는지, 혹은 접혀있는지를 센다면, 기계는 손가락에 특정 순서를 할당하여 몇 번째 손가락이 펴지고 접혔는지를 파악하여 그것을 숫자로 인식하는 식이다. 그래서 손가락 5개로 사람은 0부터 5까지 세지만, 기계는 0부터 25-1=31까지 셀 수 있으며, 검지, 중지, 약지, 새끼를 펴고 엄지만 굽힌다면 사람은 '4'라고 인식하겠지만 기계는 23+22+21+20=15로 인식할 것이다. 이론상 열 손가락으로 0부터 1023까지 셀 수 있다.[2]

2. 표현법

xxx(2)와 같은 형태로 표기한다. 예를 들어 2는 한 자리 올려서 10(2), 6은 110(2)이 된다. 그 외에 숫자 끝에 아래첨자로 2를 작성하여 11002처럼 2진수임을 나타내는 방식도 있다. 컴퓨터공학을 전공하는 사람들 중에는 이진수를 쓰고 뒤에 B를 붙이는 경우도 있는데, 이는 어셈블리어에서 2진수를 나타낼 때 1100B 형식으로 작성하기 때문이다. 비슷하게 프로그래머의 경우 몇몇 프로그래밍 언어[3]에서 쓰는 방식대로 0b1100처럼 앞에 0b를 붙히기도 한다. 특히나 4자리씩 띄워서 읽는다면 100% 컴공과.

전자기기에서 음수는 첫자리(가장 높은 자리)의 수가 1인 것으로 나타낸다. 즉 첫 번째 숫자가 0이면 양수이고, 1이면 음수이다. 이건 그냥 컴퓨터의 정수 표기법에 대한 약속이고 진법 자체와는 관련이 없다. 1의 보수(1's complement, 1'C)[4], 2의 보수(2's complement, 2'C) 등의 방식이 있으며, 컴퓨터에서 가장 널리 사용하는 것은 2의 보수이다. 1의 보수는 양수에서 모든 비트를 반전시켜서 표현하는 것이고, 여기에 1을 더한 것이 2의 보수이다. 예를 들어보면 다음과 같다.1의 보수에서는 0000 0000 과 1111 1111 이 모두 0이 되므로 0이 두 가지로 표현되는 문제가 생긴다. 2의 보수 표기는 10진수와 상호 변환하기 가장 어려운 표기법이긴 하나[5], 연산에서 양수와 음수를 똑같이 취급할 수 있다는 엄청난 이점이 있다.

예를 들어 3 + (-5)를 한다고 하자. 2의 보수 표기법에서는 0000 0011 + 1111 1011이 되고 계산해보면 1111 1110 = -2가 된다. 마치 둘 다 양수인 양 더했더니 올바른 값이 나와버렸다. 이는 음수+음수도 마찬가지다. -5 + (-7) = 1111 1011 + 1111 1001 = 1 1111 0100 = 1111 0100 = -12이다. 다른 어떤 음수 표기법도 부호 확인 없이 때려넣으면 저렇게 정답이 나오지 않는다. 이렇게 연산 과정에서 부호를 고려할 필요가 없다는 점은 속도에 약간의 이익을 주는데, 덧셈과 뺄셈이라는 연산은 CPU 내에서 10진수로 출력하기 따위와는 비교가 불가능할 정도로 오질나게 많이 하는 연산이므로 컴퓨터는 내부적으로 2의 보수 표기법을 쓴다. 다만 이 방식은 그 대가로 치명적인 오류를 안고 있어서 미리 방지하는 것이 필수이다.

일단 전기 신호가 들어온다, 안 들어온다라는 식으로 쉽게 구현할 수 있어서 전자기기, 특히 컴퓨터에서 사용한다. 그리고 고등학교 수학 과정의 지수/로그 파트에 출현해 수험생을 괴롭힌다. 물론 쫄지 말고 10진법처럼 계산하면 생각보다는 쉽게 풀리긴 한다.

한편, 위에서 볼 수 있듯이 2진법은 0과 1만으로 숫자를 표기하다보니 숫자가 조금만 커져도 엄청난 수의 0과 1이 반복되는 아찔함을 선사한다. 그만큼 사람이 보기 빡세지는데, 요 가독성을 좀 높여보고자 16진법으로 바꿔서 표현하기도 한다.

변환하는 방법을 설명하자면, 100010111110110010101101010011001101010010110101101011010110012 라는 숫자가 있다고 하자. 이를 뒤에서(일의 자리부터) 4자리씩 끊어서 (00)10 0010 1111 1011 0010 1011 0101 0011 0011 0101 0010 1101 0110 1011 0101 1001로 만든 뒤 4자리씩 16진법으로 변환해서 적으면 된다. 변환결과는 22FB2B53352D6B5916. 이것도 여전히 길어보이지만 이렇게 바꾸면 길이가 4분의 1로 줄어들고 읽기도 그나마 편해진다.

컴퓨터과학을 공부하다 보면 이진로그라는 것을 배우게 되는데, 2진법으로 표기된 수를 좀 더 쉽게 다룰 수 있게 한다.

3. 이진법을 이용한 수 표기의 예시

<colbgcolor=#96887b><colcolor=#fff> 2의 거듭제곱 220 219 218 217 216 215 214 213 212 211
10진수 표기 1048576 524288 262144 131072 65536 32768 16384 8192 4096 2048
2진수 표기 100000000000000000000 10000000000000000000 1000000000000000000 100000000000000000 10000000000000000 1000000000000000 100000000000000 10000000000000 1000000000000 100000000000
2의 거듭제곱 210 29 28 27 26 25 24 23 22 21
20
10진수 표기 1024 512 256 128 64 32 16 8 4 2 1
2진수 표기 10000000000 1000000000 100000000 10000000 1000000 100000 10000 1000 100 10 1

4. BCD 코드

Binary-Coded Decimal의 약어이며, 10진수의 각 자리수를 모두 분리해서 각각 2진수 형태로 표현한 것이다.

10진수의 한 숫자를 표현하기 위해서 BCD로 총 4자리의 2진수가 된다. 즉 10진수의 모든 숫자를 각각 0000{010} ~ 1001{910}로 옮길 수 있으며, 이때 나머지 1010 ~ 1111는 사용하지 않는다.

표기 방식은 각 자릿수마다 해당하는 4자리 2진수로 변환하면 된다.
ex) 36510 ==> 0011(1) 0110(2) 0101(3)BCD
(1) = 100의 자리 / (2) = 10의 자리 / (3) = 1의 자리

이렇게 되면 덧셈이 중요해지는데, 그냥 2진수 덧셈이랑 같은 방식으로 하는데, 만약 특정 자릿수가 9를 초과하면 0110BCD = 610을 더해주면 된다.[6]
ex) 56 + 48 = 0101 0110BCD + 0100 1000BCD
= 1001 1110BCD + 0000 0110BCD
= 1010 0100BCD = 10410

초기 공학용 계산기 등에서 사용되었다. 얼핏 보기에는 비효율적일 수도 있지만 정밀한 소수를 다뤄야 할 때에는 2진수와 10진수를 변환하면서 손실이 발생하는 것이 불가피하기 때문에 BCD를 사용하는 경우도 있다. 이걸 제대로 처리하지 못해서 발생한 문제가 2010년 문제이다.

5. 기타

세상엔 10종류의 사람이 있다. 이진법을 이해하는 사람과 그러지 못하는 사람, 그리고 이게 설마 삼진법이라고 생각하지 못한 사람.
(There are 10 types of people in the world; those that understand BINARY, and those who don't, and those who didn't expect this number to be TERNARY.)
10진법의 숫자 '2'는 2진법에서 '10'이 되며, 3진법에서는 3이 '10'이라는 것을 이용한 공대 개그가 있다. 위 내용을 해설하자면 우선 많은 일반인들은 ;앞까지만 읽고 십진법으로 숫자를 인식해 열 종류의 사람이 있다는 것으로 이해했을 테지만, 문장을 끝까지 읽고 십진법이 아닌 10(2) = 2(10)종류의 사람(2진법을 이해한 사람 / 그렇지 못한 사람)을 말하는 것이었음을 깨닫는 것이다. 그리고 취소선이 쳐진 부분까지 읽고 나면 사실 10(2)가 아니라 10(3) = 3종류의 사람(2진법을 이해한 사람 / 그렇지 못한 사람 / 이게 3진법이었음을 예상 못한 사람)을 말하는 것이었음을 알아차릴 수 있다. 사실 이대로만 가면 n진법까지 n종류의 사람이 있다고 할 수 있다.

2007 개정 교육과정까지 중학교 1학년 1학기에 나오기도 했으며[7] 2009 개정 교육과정부터 제외되었지만[8] 2015 개정 교육과정부터 다시 추가되었다.

컴퓨터의 정보처리에 이진수가 쓰인다는 점에 의거해, 뭔가 사이버스러운 작품에는 이진수가 도배되는 경우가 많다. 배경이 의미없는 이진수 숫자로 채워져 있다든지, 0과 1만 적당히 치면 되니 만들기도 쉽다. 이거 하나로 미국 대중문화에 어마어마한 족적을 남긴 매체가 바로 매트릭스. 이후 검은 바탕에 초록색으로 0과 1이 쏟아지는 텔레타이프 화면은 그야말로 해커 영화의 상징 같은 장면이 되었다.

돌아다니는 마술 카드 중 0~2n-1 중에서 상대가 생각하는 숫자 맞추기 같은 거는 이걸 사용한 것이다.

8진법과 16진법은 2진법과 본질적으로 다를 게 없다. 2진법을 가독성 좋게 묶어버린 것일 뿐... 이와 같이 생각하면 1048576(220)진법과 2진법도 완벽히 동일한 시스템에 구속되어 있다.

프로그래밍 언어 중에서 기계어가 이 이진법 숫자로만 되어 있다. 또한 프로그램 배포 시 '바이너리'라 하면 .exe와 같은 실행 파일을 뜻한다.

2001년 1월 1일에 태어난 사람의 주민등록번호 앞자리는 010101(21)이다. 정지윤(2001)윈터(aespa)가 대표적인 예이다. 한편 011111(31)인 사람은 이다현(배구선수)이다.

'악마의 계단 함수'라고 불리는 병리적 함수의 정의에도 2진법이 쓰인다.

6. 관련 문서


[1] 이 편이 인식이 간단해져 오류의 발생이 적고 속도를 쉽게 올릴 수 있기 때문이다. 즉, 논리 회로에선 이 0과 1을 단순히 숫자가 아닌 서로를 반대하는 기호라고 이해하는게 쉽다.[2] 손바닥을 보이게 두 손을 놓은 후, 손가락을 다 접은게 0이다. 그리고 오른손 엄지를 피면 2^0, 오른속 검지를 펴면 20 + 21, 오른손 소지를 편 후엔 왼손 소지로 넘어가서 쭉 왼손 엄지까지 가면 열 손가락을 다 펴게되어 20 + 21 + 23 + ... + 29 = 1023 까지 셀 수 있다.[3]C언어가 바이너리 리터럴을 지원하지 않기 때문에 사실 대중적인 표현이라고 하긴 힘들다. 즉 이 방식을 쓰지 않는 프로그래머도 많다는 말. 프로그래머들은 디버깅, 리버싱, 덤핑 등 온갖 일에는 주로 16진법을 사용하기도 하고...[4] 補數, complement[5] 그래봤자 별 거 없다. 비트 반전시키고 1 더하면 끝이다.[6] 이는 위에 언급되었던 사용하지 않는 표현 1010BCD ~ 1111BCD을 건너뛰기 위함.[7] 7차 교육과정까지 2진법의 덧셈과 뺄셈도 있었다. 6차 교육과정까지는 5진법도 있었다.[8] 단, 공고 같은 경우 정보기술과 활용 과목에서 나왔다.

분류