Python 如何使'bin(30)'返回'0001110'而不是'0b11110'?

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)的输出中,“b”代表什么:“0b11110”?我有办法摆脱这个“b”吗?如何使bin()的输出始终返回标准的8位输出?

0b类似于0x-它表示数字格式为二进制(0x表示数字格式为十六进制)

要去除0b,最容易使用字符串切片:
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:]