Python 如何使'bin(30)'返回'0001110'而不是'0b11110'?
在bin(30)的输出中,“b”代表什么:“0b11110”?我有办法摆脱这个“b”吗?如何使bin()的输出始终返回标准的8位输出?0b类似于0x-它表示数字格式为二进制(0x表示数字格式为十六进制) 看 看 要去除0b,最容易使用字符串切片:Python 如何使'bin(30)'返回'0001110'而不是'0b11110'?,python,Python,在bin(30)的输出中,“b”代表什么:“0b11110”?我有办法摆脱这个“b”吗?如何使bin()的输出始终返回标准的8位输出?0b类似于0x-它表示数字格式为二进制(0x表示数字格式为十六进制) 看 看 要去除0b,最容易使用字符串切片:bin(30)[2: 同样,对于8个字符宽的格式: ('00000000'+bin(30)[2:])[-8:] 或者,您可以使用(在2.6+中)在一个步骤中完成所有操作: "{0:08b}".format(30) 使用: 返回长度-宽度字符串中由零填
bin(30)[2:
同样,对于8个字符宽的格式:
('00000000'+bin(30)[2:])[-8:]
或者,您可以使用(在2.6+中)在一个步骤中完成所有操作:
"{0:08b}".format(30)
使用:
返回长度-宽度字符串中由零填充的数字字符串。符号前缀处理正确。如果宽度小于len,则返回原始字符串
利用著名的
format()
函数和鲜为人知的第二个参数,并将其与zfill()
'b'
-二进制
'x'
-Hex
'o'
-八进制
'd'
-十进制
>>> print format(30, 'b')
11110
>>> print format(30, 'b').zfill(8)
00011110
应该这样做。这里的
'b'
代表二进制,就像'x'
,'o'
和'd'
分别代表十六进制、八进制和十进制一样 >当前答案不考虑否定值(感谢Gui13为评论!),在这种情况下,你得到<代码> -0b…< /代码>,而不只是<代码> 0B…< /代码>。您可以使用一个简单的if-else
来处理这两个问题,其中检查值是否小于零
>>> def printBit(x):
if x < 0:
return '-' + bin(x)[3:].zfill(8) # replace
else:
return bin(x)[2:].zfill(8)
>>> print(printBit(30))
'00011110'
>>> print(printBit(-30))
'-00011110'
上述调用的问题是,由于zfill()
使用了相同的值,其中一个位“丢失”到-
符号。您也可以通过简单的三元检查来处理此问题:
>>> x = 30
>>> print(bin(x)).replace('0b', '').zfill(9 if x < 0 else 8)
'00011110'
>>> x = -30
>>> print(bin(x)).replace('0b', '').zfill(9 if x < 0 else 8)
'-00011110'
以下是最终版本,可调整填充0
s,并在每个n
字符之间附加空格分隔(其中n
由填充因子决定):
def pb(x,fillingBits=4,splitWithSpace=True):
#如果没有负号,第二次替换没有任何作用
bres=bin(x)。替换('0b','')。替换('-','')
lres=长度(bres)
bres=bres.zfill(lres+(填充位-(lres%填充位)))
lres=长度(bres)
#我们还可以在每个fillingBits字符后添加一个空格
如果使用空格分隔:
bres=''.join([bres[i:(i+fillingBits)]表示范围内的i(0,lres,fillingBits)])
bres=('-'如果x<0,则为')+bres
#我们删除任何尾随/前导空格(在启用splitWithSpace时发生)
返回bres.strip()
>>>印刷品(pb(7))
'0111'
>>>打印(pb(-7))
'-0111'
>>>印刷品(pb(30))
'0001 1110'
>>>打印(pb(-30))
'-0001 1110'
python 2.7 打印“{0:b}”。格式(30) Python3.x 打印({0:b}.format(30))您可以在Python 2或Python 3中使用格式:
[]的您也可以使用它:
bi=bin(n)[2:]
这将删除返回值的
'0b'
部分,您可以在任何地方使用输出 +1对于string.format
answer,请告诉我在这种情况下,我更喜欢内置的format函数,而不是format方法:format(30,'08b'),而不是“{0:08b}”。format(30)不要对单个占位符使用str.format()
。这就是我们的format()
的目的:format(30,'08b')
负数是什么?令人惊讶的是,这似乎是最快的,但是ackkkk。@loannis您的编辑导致了问题,因为现在为负值提供了错误的结果,-30!=30而您的编辑将导致bin(30).lstrip('-0b').zfill(8)=bin(-30).lstrip('-0b').zfill(8)
这两个代码段都将在Python2.x上工作,并且都将导致Python3.x上的语法错误,因为print是3.x中的函数。你是不是想把第二段代码打印出来(“{0:b}”.format(30))?你说得对,我忘了Python3.x中的打印是带()的,我会在执行“智能”之前重新编辑它。OP清楚地询问了填充以及bin()
(至少在我写这个答案时)不处理两个补码的事实,并且返回一个负数作为-
,后跟转换后的二进制。接受的答案甚至会删除-
,这会导致负数与正数相同。
>>> x = 30
>>> print(bin(x)).replace('0b', '').zfill(9 if x < 0 else 8)
'00011110'
>>> x = -30
>>> print(bin(x)).replace('0b', '').zfill(9 if x < 0 else 8)
'-00011110'
>>> def pb(x):
bres = bin(x).replace('0b', '').replace('-', '') # If no minus, second replace doesn't do anything
lres = len(bres) # We need the length to see how many 0s we need to add to get a quadruplets
# We adapt the number of added 0s to get full bit quadruplets.
# The '-' doesn't count since we want to handle it separately from the bit string
bres = bres = ('-' if x < 0 else '') + bres.zfill(lres + (4-lres%4))
return bres
>>> print(pb(7))
'0111'
>>> print(pb(-7))
'-0111'
>>> print(pb(30))
'00011110'
>>> print(pb(-30))
'-00011110'
>>> def pb(x, fillingBits=4, splitWithSpace=True):
# If no minus, second replace doesn't do anything
bres = bin(x).replace('0b', '').replace('-', '')
lres = len(bres)
bres = bres.zfill(lres + (fillingBits - (lres % fillingBits)))
lres = len(bres)
# We can also add a blank after every fillingBits character
if splitWithSpace:
bres = ' '.join([bres[i:(i + fillingBits)] for i in range(0, lres, fillingBits)])
bres = ('-' if x < 0 else '') + bres
# We remove any trailing/leading blanks (occurring whenever splitWithSpace enabled)
return bres.strip()
>>> print(pb(7))
'0111'
>>> print(pb(-7))
'-0111'
>>> print(pb(30))
'0001 1110'
>>> print(pb(-30))
'-0001 1110'
>> print( format(15, '08b') )
00001111
bi=bin(n)[2:]