밑이 2 진 문자열을 int로 변환


306

기본 2 이진 숫자 문자열을 다음과 같이 int로 변환하고 싶습니다.

>>> '11111111'.fromBinaryToInt()
255

파이썬에서 이것을 할 수있는 방법이 있습니까?


3
실제로는 중요하지 않지만 이진 문자열은 일반적으로 실제 이진 데이터를 포함하는 문자열을 의미합니다 (한 바이트에는 두 개의 16 진수가 포함되어 있습니다 (예 : "\ x00"은 null 바이트)).
trevorKirkby

답변:


563

내장 int함수를 사용하여 입력 번호의 기본, 즉 2이진수에 전달하십시오 .

>>> int('11111111', 2)
255

다음은 python2python3에 대한 설명서입니다 .


61
누군가가 반대를 찾고있는 경우 : bin(255)-> '0b11111111'. 자세한 내용은 이 답변 을 참조 하십시오.
Akseli Palén

7
이것은 부호없는 이진 정수에서만 작동합니다. 부호있는 정수의 경우 변환 옵션이 엉망입니다.
가짜 이름

2
파이썬 3에서 어떻게해야합니까?
사라 스 아리아

2
@SarasArya 매우 유사합니다! :) 업데이트했습니다. 위를 참조하십시오.
풀기

1
대화식 REPL 세션 ( >>>프롬프트에서 제안한대로 )에서는 전혀 사용할 필요가 없습니다 print. OP의 가상의 예는 그렇지 않았습니다. 따라서 파이썬 2와 3에서 실제로 동일해야합니다.
John Y

37

파이썬 대화 형 인터페이스에서 0b11111111 을 입력 하십시오 .

>>> 0b11111111
    255

28

이를 수행하는 또 다른 방법은 bitstring모듈 을 사용하는 것입니다 .

>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255

부호없는 정수는 부호있는 정수와 다릅니다.

>>> b.int
-1

bitstring모듈은 요구 사항은 아니지만 입력을 비트에서 다른 형식으로 바꾸거나 조작 할 수있는 성능이 뛰어난 방법이 많이 있습니다.


8

base와 함께 int를 사용하는 것이 올바른 방법입니다. int가 기본을 차지하기 전에이 작업을 수행했습니다. 기본적으로 이진수를 십진수로 변환하는 기본 방식의 목록 이해에 적용되는 감소입니다 (예 : 110 = 2 ** 0 * 0 + 2 ** 1 * 1 + 2 ** 2 * 1).

add = lambda x,y : x + y
reduce(add, [int(x) * 2 ** y for x, y in zip(list(binstr), range(len(binstr) - 1, -1, -1))])

4
대신 정의하는 add = lambda x, y: x + y, int.__add__감소시키기 위해 제공 될 수 있습니다. 예 :reduce(int.__add__, ...)
Jordan Jambazov

4

무대 뒤에서 무슨 일이 일어나고 있는지 알고 싶다면 여기로 가십시오.

class Binary():
def __init__(self, binNumber):
    self._binNumber = binNumber
    self._binNumber = self._binNumber[::-1]
    self._binNumber = list(self._binNumber)
    self._x = [1]
    self._count = 1
    self._change = 2
    self._amount = 0
    print(self._ToNumber(self._binNumber))
def _ToNumber(self, number):
    self._number = number
    for i in range (1, len (self._number)):
        self._total = self._count * self._change
        self._count = self._total
        self._x.append(self._count)
    self._deep = zip(self._number, self._x)
    for self._k, self._v in self._deep:
        if self._k == '1':
            self._amount += self._v
    return self._amount
mo = Binary('101111110')


1

python3.6 이상을 사용하는 경우 f-string을 사용하여 변환을 수행 할 수 있습니다.

이진수를 십진수로 :

>>> print(f'{0b1011010:#0}')
90

>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90

이진수에서 8 진수로 등

>>> f'{0b1011010:#o}'
'0o132'  # octal

>>> f'{0b1011010:#x}'
'0x5a'   # hexadecimal

>>> f'{0b1011010:#0}'
'90'     # decimal

콜론으로 분리 된 2 개의 정보에주의하십시오.

이런 식으로 콜론의 오른쪽을 변경하여 {binary, octal, 16 진수, decimal}을 {binary, octal, 16 진수, decimal}로 변환 할 수 있습니다.

:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal 
:#0 -> converts to decimal as above example

8 진수 / 16 진수 / 10 진수를 갖도록 콜론의 왼쪽을 변경해보십시오.


0

큰 행렬 (10 ** 5 행 이상)의 경우 벡터화 된 matmult를 사용하는 것이 좋습니다. 한 번에 모든 행과 열을 전달하십시오. 매우 빠릅니다. 파이썬에는 루핑이 없습니다. 원래 MovieLens의 10 가지 장르 열과 같은 0/1과 같은 많은 이진 열을 각 예제 행의 단일 정수로 변환하도록 설계했습니다.

def BitsToIntAFast(bits):
  m,n = bits.shape
  a = 2**np.arange(n)[::-1]  # -1 reverses array of powers of 2 of same length as bits
  return bits @ a
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.