是否有任何固定的Python方法可以将Integer(或Long)转换为Python中的二进制字符串?
Google上有无数的dec2bin()函数......但我希望我可以使用内置的函数/库.
Python的字符串格式方法可以采用格式规范.
>>> "{0:b}".format(37) '100101'
格式化Python 2的规范文档
格式化Python 3的规范文档
如果你正在寻找bin()
相同的hex()
,它是在python 2.6中添加的.
例:
>>> bin(10) '0b1010'
Python实际上确实已经内置了一些内容,能够执行诸如的操作'{0:b}'.format(42)
,这将为您提供位模式(在字符串中)42
,或101010
.
对于更一般的哲学,任何语言或图书馆都不会为其用户群提供他们想要的一切.如果您在一个无法提供所需内容的环境中工作,那么您应该在开发时收集代码片段,以确保您不必再编写两次相同的内容.例如:
def int_to_bin_string(i): if i == 0: return "0" s = '' while i: if i & 1 == 1: s = "1" + s else: s = "0" + s i //= 2 return s
假设Python还没有更简单的方法,它将根据十进制值构造二进制字符串.
一般的想法是使用代码(按优先顺序):
语言或内置库.
具有合适许可证的第三方库.
你自己的收藏.
您需要编写的新内容(并保存在您自己的集合中以供日后使用).
作为参考:
def toBinary(n): return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])
此函数可以转换一个大的正整数18446744073709551615
,表示为字符串'1111111111111111111111111111111111111111111111111111111111111111'
.
它可以被修改为提供更大的整数,但它可能不像"{0:b}".format()
或更方便bin()
.
如果你想要一个没有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)
带有lambda的单线程:
>>> 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:b}".format(10) '1010'
如果你想拥有一个固定长度的二进制字符串,你可以使用这个:
>> "{0:{fill}8b}".format(10, fill='0') '00001010'
如果需要两个补码,则可以使用以下行:
'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)
其中n是二进制字符串的宽度.
替代方案摘要:
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.
这是针对python 3的,它保持前导零!
print(format(0, '08b'))
使用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)
由于前面的答案大多使用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。