Pythonで整数をバイナリに変換する


179

整数をバイナリに変換するために、次のコードを使用しました。

>>> bin(6)  
'0b110'

そして、「0b」を消去するとき、私はこれを使います:

>>> bin(6)[2:]  
'110'

の代わりに表示6したい場合はどうすればよいですか?00000110110


回答:


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

書式設定文字列の部分を説明するだけです。

  • {} 変数を文字列に配置します
  • 0 引数の位置0で変数を受け取ります
  • :この変数のフォーマットオプションを追加します(それ以外の場合は10進数を表します6
  • 08 数値を左側にゼロ詰めした8桁にフォーマットします
  • b 数値をバイナリ表現に変換します

Python 3.6以降のバージョンを使用している場合は、f-stringsも使用できます。

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

7
最初0はへの0th引数を意味しますformat。コロンがフォーマットされた後、2番目0は8つのスペースへのb
ゼロフィル

@Aif:また、標準のドキュメントdocs.python.org/library/…をご覧ください
pepr

19
これは、と単純化することができるformat() 機能format(6, '08b')。この関数は、値({..}スロットが適用されるもの)とフォーマット指定(:フォーマット文字列の後に挿入するものは何でも)を取ります。
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'。サインが必要ない場合はどうしますか?struct-6%256
n611x007 14年

1
@ AK47はい、Pythoon 2.6以降では、0bまたは0Bのプレフィックスを持つバイナリ形式でint定数を記述できます: 0b00000110
Denis Barmenkov

102

ちょうど別のアイデア:

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

文字列補間による短い方法(Python 3.6+):

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

7
このソリューションは、受け入れられているソリューションよりも高速であることに注意してください。どちらの解決策がより明確であるか(あるいは、あえて言うと、Pythonic)、おそらく個人的な好みの問題です。
エア

私はまだ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、一度に1ビット(0または1)を効果的に抽出します。
usr2564301

16

format関数を使用するだけです

format(6, "08b")

一般的な形式は

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

1
はい、私はこれが好きです、それはシンプルで最速の1つです:-) 1000000 loops, best of 3: 556 ns per loop
SebMa '12

10

eumiroの答えはより良いですが、私はこれをバラエティのために投稿しています:

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

3
へえ。これは非常に間違っているので、賛成しなければなりませんでした。数字を10進数として解釈するのは巧妙です。さらに悪いことに:'%08x' % int(bin(6)[2:], 16)
Mad Physicist

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 2018

0

常に一定ではない変数から表すために使用される桁数を解析する場合、numpy.binaryを使用することをお勧めします。

バイナリをパワーセットに適用する場合に役立ちます

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

0

最善の方法は、フォーマットを指定することです。

format(a, 'b')

のバイナリ値を文字列形式で返します。

バイナリ文字列を整数に戻すには、int()関数を使用します。

int('110', 2)

バイナリ文字列の整数値を返します。


ユーザーが希望するフォーマットを取得するには、format(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.