Python에서 이진수, 8진수 및 16진수 숫자와 문자열을 서로 변환

사업

파이썬은 숫자와 문자열을 이진수, 8진수, 16진수뿐만 아니라 일반적인 10진수로 처리할 수 있습니다. 그들 사이에서 변환하는 것도 쉽습니다.

이 섹션에서는 샘플 코드와 함께 다음 내용을 설명합니다.

  • 2진수, 8진수, 16진수로 정수를 씁니다.
  • 숫자를 2진수, 8진수 및 16진수 표기법의 문자열로 변환합니다.
    • 내장 함수(예: 프로그래밍 언어)bin(),oct(),hex()
    • 문자열 메서드str.format(), 내장 기능format(), f 문자열
    • 음의 정수를 2의 보수 형식의 문자열로 변환합니다.
  • 2진수, 8진수 및 16진수 표기법의 문자열을 숫자로 변환합니다.
    • 내장 함수(예: 프로그래밍 언어)int()
  • 적용 사례
    • 이진 문자열 산술
    • 2진수, 8진수, 16진수 간 변환

2진수, 8진수, 16진수로 정수를 씁니다.

다음 접두사를 추가하면 정수 int 숫자를 각각 2진수, 8진수, 16진수로 쓸 수 있습니다.
대문자를 사용할 수도 있습니다.

  • 이진수:0b또는0B
  • 8진수:0o또는0O
  • 16진수:0x또는0X

print()의 출력은 10진수 표기법으로 표시됩니다.

bin_num = 0b10
oct_num = 0o10
hex_num = 0x10

print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16

Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

접두사가 있어도 유형은 정수 int입니다.

print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

정수형이므로 일반 산술 연산에 사용할 수 있습니다.

result = 0b10 * 0o10 + 0x10
print(result)
# 32

Python 3.6부터 숫자에 밑줄 _을 삽입할 수 있습니다. 밑줄 _을 반복하면 오류가 발생하지만 반복하지 않는 한 원하는 만큼 삽입할 수 있습니다.

_ 밑줄은 숫자에 영향을 미치지 않으므로 자릿수가 많을 때 구분 기호로 사용할 수 있습니다. 예를 들어 4자리마다 밑줄 _을 삽입하면 읽기 쉽습니다.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

숫자를 2진수, 8진수 및 16진수 표기법의 문자열로 변환합니다.

숫자를 2진수, 8진수 또는 16진수 표기법의 문자열로 변환하려면 다음 내장 함수를 사용하십시오.

  • 내장 함수(예: 프로그래밍 언어)bin(),oct(),hex()
  • 문자열 메서드str.format(), 내장 기능format(), f 문자열

이 섹션에서는 음수 값에 대해 2의 보수 형식으로 표현된 문자열을 얻는 방법도 설명합니다.

내장 함수 bin(), oct(), hex()

다음 내장 함수는 숫자를 2진수, 8진수 및 16진수 문자열로 변환할 수 있습니다.

  • 이진수:bin()
  • 8진수:oct()
  • 16진수:hex()

각각은 다음 접두사가 있는 문자열을 반환합니다.

  • 이진수:0b
  • 8진수:0o
  • 16진수:0x
i = 255

print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff

print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>

접두사가 필요하지 않으면 slice[2:]를 사용하여 뒤에 있는 문자열을 추출하거나 다음에 설명하는 대로 format()을 사용합니다.

print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff

10진수 문자열로 변환하려면 str()을 사용할 수 있습니다.

print(str(i))
# 255

print(type(str(i)))
# <class 'str'>

내장 함수 format(), 문자열 메서드 str.format(), f 문자열

내장 함수 format()과 문자열 메서드 str.format() 및 f-string도 숫자를 2진수, 8진수 및 16진수 문자열로 변환할 수 있습니다.

format()의 두 번째 인수를 다음과 같이 지정하면 각각 2진수, 8진수, 16진수 문자열로 변환할 수 있습니다.

  • 이진수:b
  • 8진수:o
  • 16진수:x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff

print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>

접두사가 0b,0o,0x인 문자열을 얻으려면 서식 지정 문자열에 #을 추가합니다.

print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff

0은 임의의 숫자로 채울 수도 있습니다. 접두사로 0을 채울 때 접두사의 문자 수(2자)도 고려해야 합니다.

print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff

print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff

문자열 메서드 str.format()도 변환에 사용할 수 있습니다.

print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff

Python 3.6부터 f 문자열을 사용할 수도 있습니다.f'xxx'

print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff

음의 정수를 2의 보수 형식의 문자열로 변환합니다.

음의 정수가 bin() 또는 format()을 사용하여 2진수 또는 16진수 문자열로 변환되면 절대값에 빼기 기호가 표시됩니다.

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

Python에서 음수에 대한 비트 연산은 2의 보수 표현으로도 수행됩니다. 따라서 2의 보수 형식으로 표현된 문자열을 얻으려면 비트 논리 OR& 다음과 같이 필요한 최대 비트 자릿수를 사용합니다.

  • 4bit:0b1111(=0xf)
  • 8bit:0xff
  • 16bit:0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

2진수, 8진수 및 16진수 표기법의 문자열을 숫자로 변환합니다.

내장 함수 int()

2진수, 8진수 또는 16진수 표기법의 문자열을 숫자로 변환하려면 내장 함수 int()를 사용하십시오.

int(string, radix)를 사용하면 이진, 8진, 16진법 등의 문자열 str을 기수를 기반으로 숫자 int로 변환할 수 있습니다. 기수가 생략되면 숫자는 십진수로 간주됩니다.

print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16

print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>

radix가 0으로 설정되면 다음 문자열 접두사를 기반으로 변환이 수행됩니다.

  • 바이너리 접두사:0b또는0B
  • 8진수 접두사:0o또는0O
  • 16진수 접두사:0x또는0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16

print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16

기수가 0이고 접두사가 없으면 십진수로 변환되지만 시작(왼쪽)이 0으로 채워지면 오류가 발생하므로 주의하십시오.

print(int('10', 0))
# 10

# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'

다른 경우에는 0으로 채워진 문자열을 있는 그대로 변환할 수 있습니다.

print(int('010'))
# 10

print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255

지정된 기수 또는 접두사로 문자열을 변환할 수 없으면 오류가 발생합니다.

# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'

# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'

# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'

적용 사례

이진 문자열 산술

예를 들어, 접두사가 0b인 이진 표기법의 문자열에 대한 작업을 수행합니다.

이를 숫자 값(정수 유형 int)으로 쉽게 변환하고 연산을 수행한 다음 다시 문자열 str로 변환할 수 있습니다.

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

2진수, 8진수, 16진수 간 변환

2진, 8진 및 16진 문자열을 서로 변환하는 것도 쉽습니다. 숫자 int로 변환되면 모든 형식의 문자열로 변환될 수 있습니다.

0 채우기, 접두사 등은 서식 지정 문자열로 제어할 수 있습니다.

a_0b = '0b1110001010011'

print(format(int(a, 0), '#010x'))
# 0x00000009

print(format(int(a, 0), '#010o'))
# 0o00000011