2進数の2進数文字列をintに変換します


306

私は単純に次のような2進数の2進数文字列をintに変換したいと思います。

>>> '11111111'.fromBinaryToInt()
255

Pythonでこれを行う方法はありますか?


3
本当に重要ではありませんが、バイナリ文字列は通常、実際のバイナリデータを含む文字列を意味します(バイトには2つの16進数が含まれます。つまり、「\ x00」はnullバイトです)。
trevorKirkby 2014年

回答:


563

組み込みint関数を使用して、入力数値のベース、つまり22進数を渡します。

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

ここでのドキュメントでpython2、そしてのためのpython3


61
誰かが反対を探している場合:bin(255)-> '0b11111111'。詳細については、この回答を参照してください。
AkseliPalén2013年

7
これは、符号なしの2進整数に対してのみ機能することに注意してください。符号付き整数の場合、変換オプションは混乱します。
偽名

2
Python 3でこれを行う方法?
Saras Arya、2015

2
@SarasAryaとても似ています!:)私は更新しました、上記を参照してください。
2015

1
また、対話型REPLセッションでは(>>>プロンプトで示されるように)、printまったく使用する必要がないことに注意してください。OPの架空の例にはありませんでした。そのため、Python 2と3で同じにする必要があります
John Y

37

Pythonインタラクティブインターフェイスに0b11111111と入力するだけです。

>>> 0b11111111
    255

28

これを行う別の方法は、bitstringモジュールを使用することです。

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

符号なし整数は、符号付き整数とは異なることに注意してください。

>>> b.int
-1

bitstringモジュールは必要条件ではないが、それは他の形態へのビットへとからの入力を回すだけでなく、それらを操作するためのパフォーマンスの方法の多くを有します。


8

intをbaseで使用するのが正しい方法です。私は、intがベースを取ることを見つける前にこれを行っていました。これは基本的に、2進数を10進数に変換する原始的な方法のリスト内包に適用される削減です(たとえば、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 + yint.__add__削減するために提供することができます。例えばreduce(int.__add__, ...)
ヨルダン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を使用して変換できます。

2進数から10進数へ:

>>> 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つの情報に注意してください。

このように、コロンの右側を変更することで、{2進数、8進数、16進数、10進数}を{2進数、8進数、16進数、10進数}に変換できます[:]

:#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行以上)の場合は、ベクトル化された行列を使用することをお勧めします。すべての行と列を一度に渡します。非常に高速です。ここではpythonのループはありません。私はもともと、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.