파이썬에서 정수를 이진수로 변환


답변:


355
>>> '{0:08b}'.format(6)
'00000110'

서식 문자열의 일부를 설명하기 위해 :

  • {} 변수를 문자열에 넣습니다
  • 0 인수 위치 0에서 변수를 사용합니다.
  • :이 변수에 대한 형식화 옵션을 추가합니다 (그렇지 않으면 10 진수를 나타냄 6).
  • 08 왼쪽에 숫자가 0 인 숫자를 8 자리로 형식화
  • b 숫자를 이진 표현으로 변환

Python 3.6 이상의 버전을 사용하는 경우 f- 문자열을 사용할 수도 있습니다.

>>> f'{6:08b}'
'00000110'

7
첫 번째 0는에 대한 0th인수를 의미합니다 format. 콜론 포맷이되면, 두 번째 0수단은 8 공백 및 제로 채우기 b진 대
jamylak

@Aif : 또한 표준 문서 docs.python.org/library/…를
pepr

19
이는 단순화 할 수 format() 기능 : format(6, '08b'); 이 함수는 값 ( {..}슬롯이 적용되는 것)과 서식 지정 ( :포맷 문자열에서 뒤에 나오는 것)을 취합니다 .
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'. 사인을 원하지 않으면 어떻게합니까? struct? -6%256?
n611x007

1
@ AK47 예, 0B 또는 0B 접두사와 바이너리 형태 INT 상수 쓸 수 Pythoon 2.6 이후 : 0b00000110
데니스 Barmenkov

102

또 다른 아이디어 :

>>> bin(6)[2:].zfill(8)
'00000110'

문자열 보간을 통한 더 짧은 방법 ( Python 3.6+ ) :

>>> f'{6:08b}'
'00000110'

7
이 솔루션은 허용되는 것보다 빠릅니다 . 어떤 솔루션이 더 명확합니까 (또는 파이썬으로 감히 말할까요) 개인적인 취향의 문제 일 것입니다.
Air

나는 여전히 pythonicity의 본질을 배우고 있지만 이것은 훨씬 더 다재다능합니다. 나는 우아한 설명으로 받아 들여진 해결책을 보게되어 처음에 흥분했지만, 메소드를 수행하기 위해 호출되는 객체가 모든 사양이 내장 된 단일 문자열로 작성되어 원하는 길이와 같은 변수가 관여하지 않도록 경고했습니다. 비트 열의. 이렇게하면 완전히 해결되고 직관적으로 (적어도 Python 2의 경우) 각 문자를 설명 할 필요가 없습니다!
Post169

음의 정수 작동하지 않는 것은 bin(-6)[2:].zfill(8)으로 읽고'0000b110'
jlandercy

20

조금 꼬집는 방법 ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
좋은 방법입니다. 그러나 코드 의이 부분이 무엇을하는지 이해할 수 없었습니다 : str ((x >> i) & 1)
Gregory

2
@Gregory : 비트를 x오른쪽으로 이동하고 와 함께 AND를 처리하여 1한 번에 하나의 비트 (0 또는 1)를 효과적으로 추출합니다.
usr2564301

16

그냥 형식 함수를 사용하십시오

format(6, "08b")

일반적인 형태는

format(<the_integer>, "<0><width_of_string><format_specifier>")

1
그렇습니다, 나는 이것을 좋아합니다, 그것은 간단하고 가장 빠른 것 중 하나입니다 :-) 1000000 loops, best of 3: 556 ns per loop
SebMa

10

eumiro의 답변이 더 좋지만, 다양성을 위해 이것을 게시하고 있습니다.

>>> "%08d" % int(bin(6)[2:])
00000110

3
허. 이것은 너무나 심각합니다. 나는 그것을 공표해야했습니다. 숫자를 10 진수로 해석하는 것은 교묘합니다. 더 나쁜 :'%08x' % int(bin(6)[2:], 16)
매드 물리학 자

6

.. 또는 항상 8 자리 여야하는지 확실하지 않은 경우 매개 변수로 전달할 수 있습니다.

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

5

numpy.binary_repr(num, width=None) 마법의 폭이있다

위에 링크 된 문서의 관련 예제 :

>>> np.binary_repr(3, width=4)
'0011'

입력 숫자가 음수이고 너비가 지정되면 2의 보수가 반환됩니다.

>>> np.binary_repr(-3, width=5)
'11101'

4

가는 올드 스쿨은 항상 작동

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))

number=number/2플로트를 제공합니다, 그래서 number=number//2더 나은 솔기도 나는 대체 할 number=number//2number//=2b=b+"0"함께b+="0"
Brambor

또한 OP로 요구되는 0 패딩이 없습니다
Brambor

1
('0' * 7 + bin(6)[2:])[-8:]

또는

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side

2
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Nic3500

0

항상 일정한 변수가 아닌 변수를 나타내는 데 사용되는 자릿수를 구문 분석한다고 가정하면 numpy.binary를 사용하는 것이 좋습니다.

전원 세트에 바이너리를 적용 할 때 유용 할 수 있습니다.

import numpy as np
np.binary_repr(6, width=8)

0

가장 좋은 방법은 형식을 지정하는 것입니다.

format(a, 'b')

문자열 형식으로 이진 값을 반환합니다.

이진 문자열을 다시 정수로 변환하려면 int () 함수를 사용하십시오.

int('110', 2)

이진 문자열의 정수 값을 반환합니다.


사용자가 원하는 형식을 얻으려면 형식 (a, '08b')이 더 좋습니다.
ZSG

0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.