回答:
Pythonの文字列フォーマットメソッドは、フォーマット仕様を取ることができます。
>>> "{0:b}".format(37)
'100101'
str.format()1つの値をフォーマットするだけではやり過ぎです。直行format()機能:format(n, 'b')。プレースホルダーを解析して引数と照合する必要はありません。値のフォーマット操作自体に直接進みます。str.format()フォーマットされた結果をより長い文字列に配置する必要がある場合にのみ使用します(例:テンプレートとして使用)。
0フォーマット文字列に追加しformat(10, '016b')ます。先行ゼロのある16桁にフォーマットします。
0イン"{0:b}"はドロップできませんか?つまり、フォーマットされている数値が1つだけの場合は、を置くのが正しいの"{:b}"ではないでしょうか。
"{:08b}".format(37)
str(bin(i))[2:]よりも(1000000ops用0.369s)を"{0:b}".format(i)(1000000ops用0.721s)
str.format()とにかく間違ったツールですformat(i, 'b')。代わりに使用します。ただし、パディングと配置のオプションも提供されることを考慮してください。format(i, '016b')16ビットのゼロが埋め込まれた2進数にフォーマットします。同じbin()ことを行うには、str.zfill()呼び出しを追加するbin(i)[2:].zfill(16)必要があります(呼び出す必要はありませんstr()!)。format()の可読性と柔軟性(を使用すると動的な書式設定ははるかに難しくなりますbin())は大きなトレードオフです。必要でない限り、パフォーマンスを最適化しないでください。その後、保守性を最適化します。
f"{37:b}"。
Pythonは実際に行い、すでにこのために建てられた何かを持っている、などの操作を行うための能力'{0:b}'.format(42)あなたのために(文字列の)ビット・パターンを与えるであろう、42またはを101010。
より一般的な哲学としては、言語やライブラリがユーザーの望むすべてをユーザーに提供することはありません。必要なものが正確に提供されない環境で作業している場合は、開発時にコードのスニペットを収集して、同じものを2回書く必要がないようにする必要があります。たとえば、次のような疑似コード:
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
これは、10進数値に基づいてバイナリ文字列を構築します。ただし、これは疑似コードの一般的なビットであり、最も効率的な方法ではない可能性があることを覚えておいてください。それは実際にそれがどのように行われることができるかのガイドラインとして意図されただけです。
一般的な考え方は、(優先順に)からコードを使用することです。
s = "1" + sおよびs = "0" + s行にあります。それぞれがの不要なコピーを作成します。代わりに返す前に、文字列を逆にする必要があります。
'{0:b}'.format(42)で、遅い方法は一般的にそれを行う方法の単なる例であり、実際に使用される言語に応じてO(n ^ 2)である場合とそうでない場合があります。Pythonは理想的な疑似コード言語であるため、Pythonのように見えるだけなので、それを明確にするために変更します。
s = "1" + sにsは、文字列型の場合、O(N)ではなかったかなり難解な言語になります。多分すべての文字列が逆方向に格納されている言語ですか、各文字がリンクされたリストのノードです?一般的な言語の場合、文字列は基本的に文字の配列です。その場合、文字列の前にコピーを作成する必要がありますが、他にどのようにして文字を他の文字の前に置きますか?
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)
format(integer, 'b')。bin()具体的には製造を目的としたデバッグツールであるリテラル構文整数Pythonのバイナリは、format()特定のフォーマットを生成することを意味します。
bin()Pythonのバイナリ整数リテラル構文の生成を目的としたデバッグツールであることをどのようにして知っていますか?ドキュメントでそれを見つけることができませんでした。
oct()とhex()。
str.zfill()場合は、代わりに、str.format()またはformat()動的な2番目の引数:'{0:0{1}b}'.format(x, n)またはを使用できますformat(b, '0{}b'.format(n))。
zfillは、動的な2番目の引数よりも読みやすく、理解しやすいと思うので、これはそのままにしておきます。
参考として:
def toBinary(n):
return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])
この関数は18446744073709551615、文字列として表されると同じ大きさの正の整数を変換できます'1111111111111111111111111111111111111111111111111111111111111111'。
"{0:b}".format()またはほど便利ではないかもしれませんが、はるかに大きな整数を提供するように変更できますbin()。
ラムダ付きワンライナー:
>>> 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が追加されます。
代替案の要約:
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。
str.format()1つの値をフォーマットするだけではやり過ぎです。format()関数に直接進みますformat(n, 'b')。プレースホルダーを解析して、それを引数に一致させる必要はありません。
上記の回答はほとんどformat()を使用したので、ここにf文字列の実装があります。
integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')
出力:
00111
便宜上、フォーマットされた文字列リテラルのpython docsリンクは、https://docs.python.org/3/reference/lexical_analysis.html#f-stringsです。
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)
符号付き整数(範囲-2 **(桁-1)から2 **(桁-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'
ビットごとの演算子を使用した、別のアルゴリズムによるさらに別のソリューション。
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
これは、分数なしでリマインダーと除算の結果を返すdivmod()関数を使用した簡単な解決策です。
def dectobin(number):
bin = ''
while (number >= 1):
number, rem = divmod(number, 2)
bin = bin + str(rem)
return bin
dectobin(10)結果は '0101'
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'
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')
数値のバイナリを計算するには:
print("Binary is {0:>08b}".format(16))
数値のヘキサ10進数を計算するには:
print("Hexa Decimal is {0:>0x}".format(15))
16までのすべてのバイナリを計算するには:
for i in range(17):
print("{0:>2}: binary is {0:>08b}".format(i))
17までヘキサ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
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")
これは、継続的にループする単純な2進数から10進数へのコンバーターです。
t = 1
while t > 0:
binaryNumber = input("Enter a binary No.")
convertedNumber = int(binaryNumber, 2)
print(convertedNumber)
print("")
これが私の答えです。うまくいきます。
def binary(value) :
binary_value = ''
while value !=1 :
binary_value += str(value%2)
value = value//2
return '1'+binary_value[::-1]
0か?例えばbinary(0)、あなたはあなたが期待するものを手に入れますか?