이진법

기수법 **이진법**(二進法, binary)은 두 개의 숫자(1과 0)만을 이용하는 수 체계이다. 관습적으로 0과 1의 기호를 쓰며 이들로 이루어진 수를 **이진수**라고 한다. 이진법은 라이프니츠 (Gottfried Wilhelm Leibniz)가 음양사상의 영향을 받아 발명하였다. 십진법의 1은 이진법에서는 1, 십진법의 2는 이진법에서는 10, 십진법의 3은 이진법에서는 11, 십진법의 4는 이진법에서는 100이 된다. 이처럼 이진법에서는 1로 끝나는 수 다음 수는 자릿수가 하나 더 많은 수인데, 이는 십진법에서 9로 끝나는 수 다음 수가 자릿수가 하나 더 많은 수인 것과 유사하다. 컴퓨터에서는 논리의 조립이 두 개의 숫자로만 표현되어 컴퓨터가 이해하기 쉽고 내부에 사용되는 소자의 특성상 이진법이 편리하기 때문에 이진법을 사용한다. 디지털 신호는 기본적으로 이진법 수들의 나열이며, 컴퓨터 내부에서 처리하는 숫자는 기본적으로 이진법을 이용하기 때문에 컴퓨터가 널리 쓰이는 현대에는 그 중요성이 더 커졌다.
# 표현
이진법 에서는 0과 1로 모든 수를 표현한다. 컴퓨터 상에서는 각각의 자리를 비트라고 부르며,isbn=978-89-966211-8-8 각각의 비트는 켜져있거나 꺼져있는 두 가지 상태로 표시된다. 다음 수는 십진수 155를 이진법으로 표현한 것이다. :1 0 0 1 1 0 1 12 일반적으로 이진법의 수를 십진법의 수와 구별하기 위해 다음과 같은 방법을 쓴다. :100101b (b를 덧붙임(b는 binary의 약자))(binary = 이진) :100101(2) ((2)를 덧붙임, 주로 수학에서 쓰임) :0b100101 (앞에 0b를 덧붙임, 주로 프로그래밍 언어에서 쓰임)
## 이진 자료
이진자료란 이진법 형식으로 표시되는 자료이다. 두 가지의 대조되는 데이터를 구분할 때 유리하다. 예를 들어 생의학 실험에서 50명의 환자들의 치유 여부를 0(치유되지 않았다), 1(치유되었다)로 표시한다면 숫자만으로도 쉽게 자료를 구분할 수 있다.
# 셈
{| class="wikitable" align="right" |- ! 이진수 ! 십진수 ! ! 이진수 ! 십진수 |- |align="right"|0 |align="right"|0 | |align="right"|100 |align="right"|4 |- |align="right"|1 |align="right"|1 | |align="right"|101 |align="right"|5 |- |align="right"|10 |align="right"|2 | |align="right"|110 |align="right"|6 |- |align="right"|11 |align="right"|3 | |align="right"|111 |align="right"|7 |} 십진법에서는 0에서 9까지의 숫자를 사용하는 데 비해, 이진법에서는 0에서 1까지의 숫자만을 사용한다. 십진법에서는 어떤 자리가 9를 넘어야 위로 자리올림을 하지만, 이진법에서는 어떤 자리가 1만 넘으면 자리올림을 한다. 따라서 이진수 오른쪽의 표와 같은 꼴로 나타난다. 이런 이유로 이진수에서는 십진수보다 자리수가 빠르게 늘어나버린다. 일반적으로 십진수 n자리를 이진수로 표현하면 n \times \log_{2}{10}\approx3.32n 자리수가 된다.
# 산술
십진법과 마찬가지로 이진법에서도 더하기, 빼기, 곱하기, 나누기, 제곱근 등의 산술연산을 할 수 있다.
## 더하기
두 비트를 더해주는 반가산기의 회로도한 자리짜리 이진법인 수 2개를 더했을 때의 결과는 아래와 같다. : 0 + 0 → 0 : 0 + 1 → 1 : 1 + 0 → 1 : 1 + 1 → 0, 올림 1 (∵ 1 + 1 = 2 = 0 + (1 × 21)) 여기서 올림이라는 것은 위 자리로 받아올려지는 수를 의미한다. 표로 나타내면 다음과 같다. {| class="wikitable" | ! |0 ! |1 |- !0 |0 |1 |- !1 |1 |10 |} 이진법에서는 수가 2개밖에 없기 때문에 더했을 때 나오는 경우도 4가지밖에 없고, 논리회로로 구성하기도 쉽다. 이를 논리회로로 구성하면 오른쪽과 같다. 더했을 때 각 자리가 1을 넘으면 받아올림된다는 규칙만 따르면 십진법에서와 마찬가지로 덧셈을 할 수 있다. 1 1 1 1 1 (받아올림) 1 0 1 1 1 \+ 1 1 0 1 \------------- 1 0 0 1 0 0 위의 예에서는 10111(2)(십진수로 23)과 1101(2)(십진수로 13)을 더했다. 그 결과 100100(2)가 나왔고, 이는 십진수에서 덧셈한 것과 같이 36이라는 값이다.
## 빼기
이진법에서 윗자리에서 수를 받아내려올 때 2씩 받아내려온다는 규칙을 지키면 십진법에서와 마찬가지로 뺄셈을 할 수 있다. 2 2 2 2 (받아내림) 1 ~~1~~ 0 ~~1~~ ~~1~~ ~~1~~ 0 − 1 0 1 1 1 \---------------- 1 0 1 0 1 1 1 첫째 자리에서는 0 (적은 수)에서 1 (큰 수)를 빼야하기 때문에 그 다음 자리의 수를 하나 줄이면서 (1을 뺀다) 2를 첫째 자리로 가져와서 뺄셈을 한다 (2 - 1 = 1). 첫째 자리로 2를 넘긴 결과, 둘째 자리에서의 뺄셈은 0 - 1 이 되는데 역시 적은 수에서 큰 수를 빼야하기 때문에 그 다음 자리의 수를 하나 줄이면서 2를 가져와서 뺄셈을 한다 (2 - 1 = 1). 나머지 자리에 대해서도 같은 방식의 뺄셈을 한다. 보수를 이용한 또 다른 방법도 있다. 컴퓨터는 뺄셈을 할 때 이 방법을 사용한다. 0 0 0 0 1 1 0 0 − 0 0 0 0 0 0 1 0 \----------------- 0 0 0 0 1 1 0 0 \+ 1 1 1 1 1 1 0 1 \----------------- **1**|0 0 0 0 1 0 0 1 \+ 1 \----------------- 1 0 1 0 A-B가 있으면 B에 1의 보수를 적용하고 뺄셈을 덧셈으로 전환하여 계산한다. 여기에서 **굵음체**로 표기된 올림수가 있을 경우 그대로 1을 더하고 0일경우 더하지 말고 다시 한번 1의 보수를 적용한다. : 0 − 0 → 0 : 0 − 1 → 1, 내림 1 : 1 − 0 → 1 : 1 − 1 → 0 1 1 1 1 (받아 내림) 1 1 0 1 0 1 0 − 1 0 0 1 1 \---------------- 1 0 0 0 1 1 0 \+ 1 1 \---------------- 1 0 1 0 1 1 1 예에서는 11010(2)(십진수로 26)과 1011010(2)(십진수로 90)을 빼기하면, 그 결과 값이 -1000000(2)가 나왔고, 이는 십진수에서 뺄셈한 것과 같이 -64이라는 값이다. 뺄셈은 작은 수에서 큰 수를 뺄 때 큰 수 빼기 작은 수를 한 다음 -1을 곱하는 것에 주의해야 한다. 1 1 0 1 0 \- 1 0 1 1 0 1 0 \----------------- 위의 식에서 감수와 피감수의 자리를 바꾼 다음 값에 음수를 넣는다. 1 0 1 1 0 1 0 \- 1 1 0 1 0 \----------------- \- 1 0 0 0 0 0 0
## 곱하기
이진수에서의 곱하기도 십진수와 마찬가지 방법으로 한다. 아래는 두 비트를 곱했을 때 나올 수 있는 모든 경우를 나열한 것이다. * 0\times0 = 0 * 0\times1 = 0 * 1\times0 = 0 * 1\times1 = 1 한 쪽이 0이면 무조건 0이 나오고, 한쪽이 1이면 무조건 반대쪽과 같은 수가 나온다는 성질 때문에 이진수의 곱셈은 십진수의 곱셈보다 간단하다. : 1 0 1 1 (A) : × 1 0 1 0 (B) : --------- : 0 0 0 0 ← B의 1의 자리가 0이므로 0. : + 1 0 1 1 ← B의 10의 자리가 1이므로 A를 그대로 내려적음. : + 0 0 0 0 ← B의 100의 자리가 0이므로 0. : + 1 0 1 1 ← B의 1000의 자리가 1이므로 A를 그대로 내려적음. : --------------- ← 모두 더한다. : = 1 1 0 1 1 1 0
## 나누기
이진법에서의 나누기 역시 십진법의 나누기와 비슷하다. 예를 들어서, 11011(2) 나누기 101(2)는 십진법 27 나누기 5의 몫이 5고, 나머지가 2인 것과 결과가 같다. 1 0 1 __________ 1 0 1 |1 1 0 1 1 − 1 0 1 \----- 0 0 1 1 − 0 0 0 0 \------- 0 0 1 1 1 − 0 0 1 0 1 \--------- 0 0 0 1 0
## 제곱근
이진법의 제곱근을 자리마다 구하는 과정은 십진법의 제곱근을 자리마다 구하는 과정과 같으며, 여기에 설명되어 있다. 예를 들어, 1010001(2)의 제곱근을 구하는 방법은 아래와 같다: 1 0 0 1 \--------- √ 1010001 1 \--------- 101 01 0 \-------- 1001 100 0 \-------- 10001 10001 10001 \------- 0 1010001(2)의 제곱근은 1001(2)인데 이는 십진법 81의 제곱근이 9라는 것과 일치한다.
# 십진법과의 관계
일반적으로 이진법의 i번째 자리수는 2^{i-1} 크기를 갖는다. 따라서 이진법 110010101101(2)은 다음과 같이 변환된다. : 이진법: 1 1 0 0 1 0 1 0 1 1 0 1 : 십진법: 1×211 \+ 1×210 \+ 0×29 \+ 0×28 \+ 1×27 \+ 0×26 \+ 1×25 \+ 0×24 \+ 1×23 \+ 1×22 \+ 0×21 \+ 1×20 = 3245 다음과 같은 방법으로도 이진법을 십진법으로 바꿀 수 있다. :{| class="wikitable" !전의 값 !× 2 + !다음 자리 !다음 값 |- | || || || = 0 |- |align="right"|0 ||× 2 +|| **1** || = 1 |- |align="right"|1 ||× 2 +|| **1** || = 3 |- |align="right"|3 ||× 2 +|| **0** || = 6 |- |align="right"|6 ||× 2 +|| **0** || = 12 |- |align="right"|12 ||× 2 +|| **1** || = 25 |- |align="right"|25 ||× 2 +|| **0** || = 50 |- |align="right"|50 ||× 2 +|| **1** || = 101 |- |align="right"|101 ||× 2 +|| **0** || = 202 |- |align="right"|202 ||× 2 +|| **1** || = 405 |- |align="right"|405 ||× 2 +|| **1** || = 811 |- |align="right"|811 ||× 2 +|| **0** || = 1622 |- |align="right"|1622 ||× 2 +|| **1** || = **3245** |}