How can I make `bin(30)` return `00011110` instead of `0b11110`?

Question:

What does the b stand for in the output of bin(30): 0b11110? Is there any way I can get rid of this b? How can I get the output of bin() to always return a standard 8 digit output?

Asked By: AME

||

Answers:

0b is like 0x – it indicates the number is formatted in binary (0x indicates the number is in hex).

See How do you express binary literals in python?

See http://docs.python.org/dev/whatsnew/2.6.html#pep-3127-integer-literal-support-and-syntax

To strip off the 0b it’s easiest to use string slicing: bin(30)[2:]

And similarly for format to 8 characters wide:

('00000000'+bin(30)[2:])[-8:]

Alternatively you can use the string formatter (in 2.6+) to do it all in one step:

"{0:08b}".format(30)
Answered By: Douglas Leeder

Using zfill():

Return the numeric string left filled with zeros in a string of length width. A sign prefix is handled correctly. The original string is returned if width is less than len(s).

>>> bin(30)[2:].zfill(8)
'00011110'
>>>
Answered By: gimel

Take advantage of the famous format() function with the lesser known second argument and chain it with zfill()

'b' – Binary
'x' – Hex
'o' – Octal
'd' – Decimal

>>> print format(30, 'b')
11110
>>> print format(30, 'b').zfill(8)
00011110

Should do. Here 'b' stands for binary just like 'x', 'o' & 'd' for hexadecimal, octal and decimal respectively.

Answered By: nehem

The current answers don’t consider negative values (thanks @Gui13 for the comment!) in which case you get -0b... instead of just 0b.... You can handle both with a simple if-else where the value is checked whether it’s less than zero or not

>>> 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'

or by using replace()

>>> print(bin(30)).replace('0b', '').zfill(8)

The problem with the call above is that one of the bits gets “lost” to the - sign due to the same value being used for the zfill(). You can handle this too with a simple ternary check:

>>> 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'

Last but not least you can also make the zfill() to automatically adapt the number of 0s to match a byte (8 bits) or a n number of bit quadruplets (4 bits):

>>> 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'

Here is the final version with adaptable filling of 0s and additional split with space every n characters (where the n is determined by filling factor):

>>> 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'
Answered By: rbaleksandar

python 2.7

print “{0:b}”.format(30)

python 3.x

print (‘{0:b}’.format(30))

Answered By: iratxe

You can use format in Python 2 or Python 3:

>> print( format(15, '08b') )
00001111

[]’s

Answered By: Jeiks

You can use this too :

 bi=bin(n)[2:]

This will remove the '0b' portion of the returned value and you can use the output anywhere .

Answered By: Akash Kandpal
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.