Search code examples
pythonbinaryformattingbitwise-operators

Convert to binary and keep leading zeros


I'm trying to convert an integer to binary using the bin() function in Python. However, it always removes the leading zeros, which I actually need, such that the result is always 8-bit:

Example:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001

Is there a way of doing this?


Solution

  • Use the format() function:

    >>> format(14, '#010b')
    '0b00001110'
    

    The format() function simply formats the input following the Format Specification mini language. The # makes the format include the 0b prefix, and the 010 size formats the output to fit in 10 characters width, with 0 padding; 2 characters for the 0b prefix, the other 8 for the binary digits.

    This is the most compact and direct option.

    If you are putting the result in a larger string, use an formatted string literal (3.6+) or use str.format() and put the second argument for the format() function after the colon of the placeholder {:..}:

    >>> value = 14
    >>> f'The produced output, in binary, is: {value:#010b}'
    'The produced output, in binary, is: 0b00001110'
    >>> 'The produced output, in binary, is: {:#010b}'.format(value)
    'The produced output, in binary, is: 0b00001110'
    

    As it happens, even for just formatting a single value (so without putting the result in a larger string), using a formatted string literal is faster than using format():

    >>> import timeit
    >>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format")  # use a local for performance
    0.40298633499332936
    >>> timeit.timeit("f'{v:#010b}'", "v = 14")
    0.2850222919951193
    

    But I'd use that only if performance in a tight loop matters, as format(...) communicates the intent better.

    If you did not want the 0b prefix, simply drop the # and adjust the length of the field:

    >>> format(14, '08b')
    '00001110'