이진 문자열에 파이썬 int?


530

파이썬에서 정수 (또는 Long)를 이진 문자열로 변환 할 수있는 통조림 파이썬 방법이 있습니까?

Google에는 무수한 dec2bin () 함수가 있습니다 ...하지만 내장 함수 / 라이브러리를 사용할 수 있기를 바랍니다.


순수한 문자열 처리 알고리즘에 대해서는 그 반대를 참조 하십시오 .
CopyPasteIt

답변:


750

파이썬의 문자열 형식 메소드는 형식 스펙을 취할 수 있습니다.

>>> "{0:b}".format(37)
'100101'

Python 2 용 형식 사양 문서

Python 3의 형식 사양 문서


86
str.format()하나의 값을 형식화하는 것은 과잉입니다. format()기능으로 바로 이동 하십시오 format(n, 'b'). 자리 표시자를 구문 분석하고 인수와 일치시킬 필요가 없으며 값 형식화 작업 자체로 바로 이동하십시오. str.format()서식이 지정된 결과를 더 긴 문자열로 배치해야하는 경우 에만 사용 하십시오 (예 : 템플리트로 사용).
Martijn Pieters

29
@mike : 또는 형식 지정을 사용하십시오. 0서식 문자열에 선행으로 자리 수를 추가하십시오 format(10, '016b'). 선행 0으로 16 자리로 형식화하십시오 .
Martijn Pieters

이 경우 0in "{0:b}"을 떨어 뜨릴 수 있습니까? 하나의 숫자 만 서식이 지정된 경우을 넣는 것이 맞 "{:b}"습니까?
tomasyany

1
일반적으로 4/8 / ... 비트 표현을 사용합니다 :"{:08b}".format(37)
Sparkler

2
Python3.7 이상에서 f "{37 : b}"
DA

471

bin()와 동등한 것으로 찾고 있다면 hex()python 2.6에 추가되었습니다.

예:

>>> bin(10)
'0b1010'

66
또한 str(bin(i))[2:](1000000ops의 경우 0.721s)보다 "{0:b}".format(i)(1000000ops의 경우 0.369 초)
mVChr

64
@ mVChr 누군가가 숫자를 ASCII 이진 표현으로 변환하면 속도가 중요하지 않기를 바랍니다.
Nick T

29
@ mVChr : str.format()어쨌든 잘못된 도구입니다 format(i, 'b'). 대신 사용하십시오. 패딩 및 정렬 옵션도 제공한다는 점을 고려하십시오. format(i, '016b')16 비트 0으로 채워진 이진수로 형식을 지정합니다. 같은 작업을하려면 전화 bin()를 추가 해야합니다 str.zfill(): bin(i)[2:].zfill(16)( 전화 할 필요가 없습니다 str()!). format()의 가독성과 유연성 (동적 형식화가 훨씬 어려워 짐 bin())은 훌륭한 절충점이며, 유지 관리 성을 위해 최적화해야 할 때까지 성능을 최적화하지 마십시오.
Martijn Pieters

[2 :]은 무슨 뜻인가요?
zero_cool

4
물론 파이썬 3.6 이상에서는을 사용할 수 있습니다 f"{37:b}".
Luke Davis

63

파이썬은 실제로 않습니다 이미 이것에 대한 내장 무언가가, 같은 작업을 할 수있는 능력 '{0:b}'.format(42)당신을 위해 (문자열) 비트 패턴을 줄 것이다, 42또는를 101010.


보다 일반적인 철학을 위해 언어 나 라이브러리는 사용자에게 원하는 모든 것을 제공하지 않습니다 . 정확히 필요한 것을 제공하지 않는 환경에서 작업하는 경우 동일한 내용을 두 번 작성할 필요가 없도록 개발할 때 코드 스 니펫을 수집해야합니다. 예를 들어 의사 코드와 같은 :

define intToBinString, receiving intVal:
    if intVal is equal to zero:
        return "0"
    set strVal to ""
    while intVal is greater than zero:
        if intVal is odd:
            prefix "1" to strVal
        else:
            prefix "0" to strVal
        divide intVal by two, rounding down
    return strVal

십진수 값을 기준으로 이진 문자열을 구성합니다. 가장 유사하지 않은 의사 코드의 일반적인 비트임을 명심하십시오.제안하는 반복으로 큰 차이를 만들지는 않지만 효율적인 방법 . 그것은 실제로 그것이 어떻게 수행 될 수 있는지에 대한 지침으로 의미됩니다.

일반적인 아이디어는 다음의 코드를 선호하는 순서대로 사용하는 것입니다.

  • 언어 또는 내장 라이브러리
  • 적합한 라이센스가있는 타사 라이브러리.
  • 자신의 컬렉션.
  • 새로운 내용을 작성해야합니다 (나중에 자신의 컬렉션에 저장).

1
이 답변에 좋은 조언이 있습니다. 코드가 불필요하게 느리다는 것은 너무 나쁩니다. O (N)이 수행 할 O (N ^ 2) 알고리즘을 제안합니다. 문제가되는 부분은 s = "1" + sand s = "0" + s라인에 있습니다. 각각은 불필요한 s 사본을 만듭니다. 대신 문자열을 반환하기 직전에 문자열을 되돌려 야합니다.
Andreas Magnusson

@Andreas, 내가 제안한 것은 '{0:b}'.format(42)느린 방법은 단순히 사용하는 실제 언어에 따라 O (n ^ 2) 일 수도 있고 아닐 수도있는 일반적인 방법의 예 일뿐입니다. 파이썬은 이상적인 의사 코드 언어이므로 파이썬처럼 보이므로 명확하게하기 위해 변경하겠습니다.
paxdiablo

실제로 문자열 유형일 s = "1" + s때 O (N)가 아닌 꽤 난해한 언어 일 것 s입니다. 모든 문자열이 뒤로 저장된 언어이거나 각 문자가 연결된 목록의 노드 일 수 있습니다. 일반적인 언어의 경우 문자열은 기본적으로 문자 배열입니다. 이 경우 문자열 앞에 접두사가 필요하면 다른 문자보다 먼저 문자를 넣는 방법은 무엇입니까?
Andreas Magnusson

문자열이 해당 블록 내에서 오른쪽 정렬되는 메모리 블록과 시작 문자에 대한 오프셋으로 구성된 문자열 유형을 쉽게 구상 할 수 있습니다. 문자 앞에 접두사를 붙이면 오프셋을 줄이고 문자를 저장하면됩니다. 네, , 밀교 수 있지만, 의사 코드의 비트와 함께 가능한 한 실제 문제에 대해 논쟁을 나에게 거의 의미가 특히 당신이 가능성이 수십 비트 / 반복보다 더 많은 것으로 아니에요 때문이다. 데이터 크기가 작은 경우 훨씬 많은 정렬 된 버블 정렬조차도 적절합니다. :-) 어쨌든 효율성에 대한 메모를 추가합니다.
paxdiablo

물론 효율성이 중요하다면 파이썬을 선택하지 않을 것입니다. 여전히 내 경험상 O (N²) 알고리즘을 사용하여 순진하게 작성되고 작은 데이터 세트로 테스트 된 코드가 "작동하는 것"으로 인해 훨씬 ​​더 큰 데이터 세트와 함께 빠르게 사용되는 경우가 종종 있습니다. 그런 다음 갑자기 고정 된 경우 코드를 실행하는 데 몇 시간이 걸리는 코드가 있습니다. O (N²) algos는 잠시 동안 작동하는 것처럼 보이기 때문에 교활합니다. 그러나 데이터가 확장 될 때 데이터가 작성되지 않으면 데이터를 작성한 사람은 종료되고 왜 일이 영원히 걸리는지 아무도 모릅니다.
Andreas Magnusson

41

0b 접두사가없는 텍스트 표현을 원하면 다음을 사용할 수 있습니다.

get_bin = lambda x: format(x, 'b')

print(get_bin(3))
>>> '11'

print(get_bin(-3))
>>> '-11'

n 비트 표현을 원할 때 :

get_bin = lambda x, n: format(x, 'b').zfill(n)
>>> get_bin(12, 32)
'00000000000000000000000000001100'
>>> get_bin(-12, 32)
'-00000000000000000000000000001100'

또는 기능을 선호하는 경우 :

def get_bin(x, n=0):
    """
    Get the binary representation of x.

    Parameters
    ----------
    x : int
    n : int
        Minimum number of digits. If x needs less digits in binary, the rest
        is filled with zeros.

    Returns
    -------
    str
    """
    return format(x, 'b').zfill(n)

5
또는 그냥 사용하십시오 format(integer, 'b'). bin()특히 생산을 목표로 디버깅 도구입니다 진 정수 리터럴 구문 파이썬 , format()생산의 특정 형식에 의미는.
Martijn Pieters

1
@MartijnPieters 언급 해 주셔서 감사합니다. 내 솔루션을 조정했습니다. bin()이것이 파이썬 이진 정수 리터럴 구문을 생성하기위한 디버깅 도구 라는 것을 어떻게 알 수 있습니까? 설명서에서 찾을 수 없습니다.
마틴 토마

2
문서에서 : 결과는 유효한 Python 표현식 입니다. 최종 사용자 표현을 생성하지 않고 Python 표현식을 생성하는 것이 목표입니다. 동일하게 적용 oct()하고 hex().
Martijn Pieters

4
더 많은 대안 : 대신에, 폭 동적를 만들려고하는 경우 str.zfill()사용할 수 str.format()또는 format(): 동적 두 번째 인수 '{0:0{1}b}'.format(x, n)format(b, '0{}b'.format(n)).
Martijn Pieters

@MartijnPieters 와우,이 입력에 대단히 감사합니다! 나는 이것이 형식으로 가능하다는 것을 몰랐다. 그러나 현재의 대답 zfill은 동적 두 번째 주장보다 읽기 쉽고 이해하기 쉽다고 생각 합니다.
마틴 토마

38

참고로 :

def toBinary(n):
    return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])

이 함수는 18446744073709551615string으로 표시되는 만큼 양의 정수를 변환 할 수 있습니다 '1111111111111111111111111111111111111111111111111111111111111111'.

훨씬 더 큰 정수를 제공하도록 수정할 수 있지만 "{0:b}".format()또는 만큼 편리하지는 않습니다 bin().


@GarethDavidson 어떤 버전입니까? 명시 적으로 명시하면 인터넷 검색시 더 많이 사용 될 수 있습니다.
Wolf

내가 생각하는 버전은 2.7이었다. 나는 그것이 3.x에서 작동하는지 의심한다
Gareth Davidson

17

문자열 형식을 사용하는 간단한 방법은이 페이지를 참조 하십시오 .

>> "{0:b}".format(10)
'1010'

이진 문자열의 길이를 고정하려면 다음을 사용할 수 있습니다.

>> "{0:{fill}8b}".format(10, fill='0')
'00001010'

2의 보수가 필요한 경우 다음 라인을 사용할 수 있습니다.

'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)

여기서 n은 이진 문자열의 너비입니다.


16

이것은 파이썬 3 용이며 선행 0을 유지합니다!

print(format(0, '08b'))

여기에 이미지 설명을 입력하십시오


1
간단한 답변에 감사드립니다.
reergymerej

14

람다가있는 원 라이너 :

>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)

테스트:

>>> binary(5)
'101'



편집 :

하지만 :(

t1 = time()
for i in range(1000000):
     binary(i)
t2 = time()
print(t2 - t1)
# 6.57236599922

에 비해

t1 = time()
for i in range(1000000):
    '{0:b}'.format(i)
t2 = time()
print(t2 - t1)
# 0.68017411232

그래도 0에 대해 ''을 반환합니다. 0의 정규 표현이 '0'이 아닙니까?
dietbacon

당신은 0 :), 당신은 대체 할 수 있음을보고 싶어하는 경우 '''0', 그러나 어떤 수의 선도적 인 0을 추가합니다.
Aziz Alto

11

대안 요약 :

n=42
assert  "-101010" == format(-n, 'b')
assert  "-101010" == "{0:b}".format(-n)
assert  "-101010" == (lambda x: x >= 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:])(-n)
assert "0b101010" == bin(n)
assert   "101010" == bin(n)[2:]   # But this won't work for negative numbers.

기여자로는 John Fouhy , Tung Nguyen , mVChr , Martin Thoma가 있습니다. 그리고 Martijn Pieters.


6
str.format()하나의 값을 형식화하는 것은 과잉입니다. format()기능으로 바로 이동 하십시오 format(n, 'b'). 자리 표시자를 구문 분석하고 인수와 일치시킬 필요가 없습니다.
Martijn Pieters



5

numpy pack / unpackbits를 사용하면 가장 친한 친구입니다.

Examples
--------
>>> a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> a
array([[ 2],
       [ 7],
       [23]], dtype=uint8)
>>> b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)

문제는 문자열 표현 에 관한 것 입니다. 아직도, 이것은 문자열을 먼저 거치지 않고 내가 찾던 것입니다! :)
Tom Hale

DOCO을 말한다 : (A)의 언팩 (unpack) 요소 uint8이진 값 출력 배열로 배열. 최대 255까지의 값에 적합합니다.
Tom Hale

5

부호있는 정수 (범위 -2 ** (digits-1)에서 2 ** (digits-1) -1)를 2의 보수 이진 문자열로 변환 해야하는 사람들에게는 다음과 같이 작동합니다.

def int2bin(integer, digits):
if integer >= 0:
    return bin(integer)[2:].zfill(digits)
else:
    return bin(2**digits + integer)[2:]

이것은 다음을 생성합니다.

>>> int2bin(10, 8)
'00001010'
>>> int2bin(-10, 8)
'11110110'
>>> int2bin(-128, 8)
'10000000'
>>> int2bin(127, 8)
'01111111'


4

비트 연산자를 사용하여 다른 알고리즘을 사용하는 또 다른 솔루션입니다.

def int2bin(val):
    res=''
    while val>0:
        res += str(val&1)
        val=val>>1     # val=val/2 
    return res[::-1]   # reverse the string

문자열을 바꾸지 않고 더 빠른 버전.

def int2bin(val):
   res=''
   while val>0:
       res = chr((val&1) + 0x30) + res
       val=val>>1    
   return res 

두 번째 버전은 O (N) 대신 O (N ^ 2) 알고리즘과 같은 것으로 끝날 때 확실히 빠르지 않습니다. 개발자가 마지막에 추가 패스를 수행하는 것이 첫 번째 루프에서 추가 작업을 수행하는 것보다 느리다고 생각했기 때문에 이와 같은 것들이 응용 프로그램을 죽이는 것을 보았습니다 (성능 측면에서). 일단 고정되면 실행 시간이 며칠에서 몇 초로 단축되었습니다.
Andreas Magnusson

4
def binary(decimal) :
    otherBase = ""
    while decimal != 0 :
        otherBase  =  str(decimal % 2) + otherBase
        decimal    //=  2
    return otherBase

print binary(10)

산출:

1010


4

당신은 그렇게 할 수 있습니다 :

bin(10)[2:]

또는 :

f = str(bin(10))
c = []
c.append("".join(map(int, f[2:])))
print c

bin (n) .replace ( "0b", "")
sanner little

3

방금 구현 한 코드는 다음과 같습니다. 이것은 방법이 아니지만 바로 사용할 수있는 기능으로 사용할 수 있습니다 !

def inttobinary(number):
  if number == 0:
    return str(0)
  result =""
  while (number != 0):
      remainder = number%2
      number = number/2
      result += str(remainder)
  return result[::-1] # to invert the string

3

여기에 divmod () fucntion을 사용하는 간단한 솔루션이 있습니다.

def dectobin(number):
    bin = ''
    while (number >= 1):
        number, rem = divmod(number, 2)
        bin = bin + str(rem)
    return bin

디버깅이 필요합니다. 호출 dectobin(10)'0101'의 결과
네이트


3

numpy.binary_repr(num, width=None)

위의 문서 링크의 예 :

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

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

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

2

다소 비슷한 솔루션

def to_bin(dec):
    flag = True
    bin_str = ''
    while flag:
        remainder = dec % 2
        quotient = dec / 2
        if quotient == 0:
            flag = False
        bin_str += str(remainder)
        dec = quotient
    bin_str = bin_str[::-1] # reverse the string
    return bin_str 

2

다음은 정규 수학, 루프 없음, 재귀 만 사용하는 또 다른 방법입니다. (소수점 0은 아무것도 반환하지 않습니다).

def toBin(num):
  if num == 0:
    return ""
  return toBin(num//2) + str(num%2)

print ([(toBin(i)) for i in range(10)])

['', '1', '10', '11', '100', '101', '110', '111', '1000', '1001']

2

DEC, BIN, HEX에 필요한 모든 기능을 갖춘 계산기 : (Python 3.5로 제작 및 테스트)

입력 테스트 번호를 변경하고 변환 된 번호를 얻을 수 있습니다.

# CONVERTER: DEC / BIN / HEX

def dec2bin(d):
    # dec -> bin
    b = bin(d)
    return b

def dec2hex(d):
    # dec -> hex
    h = hex(d)
    return h

def bin2dec(b):
    # bin -> dec
    bin_numb="{0:b}".format(b)
    d = eval(bin_numb)
    return d,bin_numb

def bin2hex(b):
    # bin -> hex
    h = hex(b)
    return h

def hex2dec(h):
    # hex -> dec
    d = int(h)
    return d

def hex2bin(h):
    # hex -> bin
    b = bin(h)
    return b


## TESTING NUMBERS
numb_dec = 99
numb_bin = 0b0111 
numb_hex = 0xFF


## CALCULATIONS
res_dec2bin = dec2bin(numb_dec)
res_dec2hex = dec2hex(numb_dec)

res_bin2dec,bin_numb = bin2dec(numb_bin)
res_bin2hex = bin2hex(numb_bin)

res_hex2dec = hex2dec(numb_hex)
res_hex2bin = hex2bin(numb_hex)



## PRINTING
print('------- DECIMAL to BIN / HEX -------\n')
print('decimal:',numb_dec,'\nbin:    ',res_dec2bin,'\nhex:    ',res_dec2hex,'\n')

print('------- BINARY to DEC / HEX -------\n')
print('binary: ',bin_numb,'\ndec:    ',numb_bin,'\nhex:    ',res_bin2hex,'\n')

print('----- HEXADECIMAL to BIN / HEX -----\n')
print('hexadec:',hex(numb_hex),'\nbin:    ',res_hex2bin,'\ndec:    ',res_hex2dec,'\n')

2

이진수를 계산하려면 :

print("Binary is {0:>08b}".format(16))

숫자의 진수 진수를 계산하려면 :

print("Hexa Decimal is {0:>0x}".format(15))

16 :까지 모든 이진을 계산하려면 ::

for i in range(17):
   print("{0:>2}: binary is {0:>08b}".format(i))

17까지 16 진수 10 진수를 계산하려면

 for i in range(17):
    print("{0:>2}: Hexa Decimal is {0:>0x}".format(i))
##as 2 digit is enogh for hexa decimal representation of a number

1

당신이 "순수한"파이썬을 포기하지만 화력을 많이 확보하고자하는 경우, 세이지가 - 예 여기 :

sage: a = 15
sage: a.binary()
'1111'

문자열로 반환되므로 다음과 같이 원하는 숫자로 사용하십시오.

sage: eval('0b'+b)
15

1
try:
    while True:
        p = ""
        a = input()
        while a != 0:
            l = a % 2
            b = a - l
            a = b / 2
            p = str(l) + p
        print(p)
except:
    print ("write 1 number")

6
당신이 한 일에 대한 설명을 추가하고 싶을 수도 있습니다.
Artless

1

십진수를 이진수로 변환하는 행렬 연산을 사용하는 방법을 찾았습니다.

import numpy as np
E_mat = np.tile(E,[1,M])
M_order = pow(2,(M-1-np.array(range(M)))).T
bindata = np.remainder(np.floor(E_mat /M_order).astype(np.int),2)

E입력 십진 데이터, M이진 순서입니다. bindata는 1xM 이진 행렬 형식의 출력 이진 데이터입니다.


0

다음은 지속적으로 반복되는 간단한 이진수를 10 진수로 변환하는 변환기입니다.

t = 1
while t > 0:
    binaryNumber = input("Enter a binary No.")
    convertedNumber = int(binaryNumber, 2)

    print(convertedNumber)

print("")

이것은 OP가 원하는 것과 반대 순서입니다. 그들은 int to binary를 찾고 있습니다. int에 바이너리를 제공합니다.
Cecilia

0

이것은 내 대답입니다 그것은 잘 작동합니다 ..!

def binary(value) :
    binary_value = ''
    while value !=1  :
        binary_value += str(value%2)
        value = value//2
    return '1'+binary_value[::-1]

값을 전달하면 0어떻게됩니까? 예를 들어 binary(0)기대하는 것을 얻을 수 있습니까?
Andreas Magnusson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.