2진법, 8진법, 16진법(hex라고도 해요)은 기수가 서로 다른 진법이에요. 2진법은 기수가 2이고, 8진법은 기수가 8이며, 16진법은 기수가 16이에요. 파이썬에서 일반적인 정수는 10진법이에요. 2진법, 8진법, 16진법은 모두 정수를 나타내는 표현 방식이에요. 즉, 분수나 소수 없이 양수와 음수(0을 포함해서)를 나타내고, 정수로 할 수 있는 모든 연산을 지원해요.
2진법은 숫자 0과 1만 사용하는 기수 2의 진법이에요. 컴퓨터의 트랜지스터와 스위치를 통해 흐르는 전류의 0("꺼짐")과 1("켜짐") 상태, 그리고 자기 저장 매체의 양전하와 음전하를 흔히 나타내요. 2진법으로 10진법에서 쓰는 모든 정수를 나타낼 수 있어요.
기수 2 체계의 일부를 보면 다음과 같아요. 물론 128에서 멈추지 않고 무한히 이어져요.
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 2 ** 7 | 2 ** 6 | 2 ** 5 | 2 ** 4 | 2 ** 3 | 2 ** 2 | 2 ** 1 | 2 ** 0 |
그래서 숫자 6을 2진법으로 나타내면 110이 돼요.
| 자릿값 | 4 | 2 | 1 |
|---|---|---|---|
| 2진수 | 1 | 1 | 0 |
계산은 다음과 같아요: 4 + 2 + 0 = 6
또 다른 예로 19를 보면:
| 자릿값 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| 2진수 | 1 | 0 | 0 | 1 | 1 |
2진수는 10011이 돼요.
계산은 다음과 같아요: 16 + 0 + 0 + 2 + 1 = 19
파이썬에서는 0b 접두사를 사용해 2진수 리터럴을 나타낼 수 있어요.
0b10011이라고 쓰면 파이썬은 이를 2진수로 해석하고 10진법으로 변환해요.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
파이썬에서 2진법은 정수를 쓰는 또 다른 방식일 뿐이라, 모든 수학 연산에서 2진수 표현은 정수예요.
2진법에 없는 숫자에 0b 접두사를 붙여 쓰면 SyntaxError가 발생해요.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
2진수는 정수이기 때문에, 정수로 할 수 있는 모든 연산을 2진수에도 할 수 있어요.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
2진수 표현과 정수 표현 사이에서도 연산할 수 있어요.
다만 일반적인 수학 연산자 규칙은 그대로 적용돼요. 2진수든 정수든 두 수를 나누면, 나눗셈 결과에 소수 부분이 없더라도 float를 반환해요.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
파이썬은 2진수 리터럴을 자동으로 int로 변환해요.
int를 2진수 표현으로 변환하려면 내장 [bin()][bin] 함수를 사용해요.
bin()은 0b 접두사가 붙은 2진수 str을 반환해요.
>>> bin(19)
'0b10011'
2진수 리터럴을 정수로 변환하려면 내장 int() 함수에 2진수 표현 문자열과 기수를 인자로 넘겨요:
>>> int("0b10011", 2)
19
기수를 잘못 주거나 (또는 유효하지 않은 2진수 표현을 주면) ValueError가 발생해요:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
2진수에 사용할 수 있는 특별한 메서드도 있어요.
<int>.bit_length()는 숫자를 표현하는 데 필요한 비트 수를 반환해요:
>>> 0b11011.bit_length()
5
<int>.bit_count()는 2진수에 있는 1의 개수를 반환해요.
예를 들어 '0b11011'에 bit_count()를 사용하면 4를 반환해요:
>>> 0b11011.bit_count()
4
로컬에서 작업한다면 bit_count()는 Python 3.10 이상이 필요해요.
Exercism 온라인 에디터는 현재 Python 3.11까지의 모든 기능을 지원해요.
8진법은 기수가 8인 진법이에요. 숫자 0, 1, 2, 3, 4, 5, 6, 7을 사용해요.
파이썬에서는 0o 접두사를 사용해 8진수를 나타낼 수 있어요.
2진법과 마찬가지로, 파이썬은 8진수 표현을 자동으로 int로 변환해요.
>>> 0o123
83
2진법과 마찬가지로 8진수는 정수이고, 모든 정수 연산을 지원해요.
8진법에 없는 숫자에 0o 접두사를 붙이면 SyntaxError가 발생해요.
int를 8진수 표현으로 변환하려면 내장 [oct()][oct] 함수를 사용할 수 있어요.
이 함수는 bin() 함수와 비슷하게 동작하며 문자열을 반환해요:
>>> oct(83)
'0o123'
8진수를 정수로 변환하려면 int() 함수에 8진수 문자열과 기수 (8)를 인자로 넘겨요:
>>> int("0o123", 8)
83
2진법과 마찬가지로, 기수를 잘못 주면 ValueError가 발생해요.
16진법은 기수가 16인 진법이에요. 숫자 0 - 9와 문자 A, B, C, D, E, F를 사용해요. A는 10, B는 11, C는 12, D는 13, E는 14, F는 15예요.
파이썬에서는 0x 접두사를 사용해 16진수를 나타낼 수 있어요.
2진법, 8진법과 마찬가지로, 파이썬은 16진수 리터럴을 자동으로 int로 변환해요.
>>> 0x123
291
2진법, 8진법과 마찬가지로 16진수 리터럴은 정수이고, 모든 정수 연산을 할 수 있어요.
16진법이 아닌 숫자에 0x 접두사를 붙이면 SyntaxError가 발생해요.
int를 16진수 표현으로 변환하려면 내장 [hex()][hex] 함수를 사용할 수 있어요.
이 함수는 bin() 함수와 비슷하게 동작하며 문자열을 반환해요:
>>> hex(291)
'0x123'
16진수 표현을 정수로 변환하려면 int() 함수에 16진수 문자열과 기수 (16)를 인자로 넘겨요:
>>> int("0x123", 16)
291
2진법, 8진법과 마찬가지로, 기수를 잘못 주면 ValueError가 발생해요.