261

In order to convert an integer to a binary, I have used this code :

>>> bin(6)  
'0b110'

and when to erase the '0b', I use this :

>>> bin(6)[2:]  
'110'

What can I do if I want to show 6 as 00000110 instead of 110?

just-Luka
  • 377
  • 1
  • 6
  • 19
Smith
  • 2,793
  • 3
  • 16
  • 12

17 Answers17

476
>>> '{0:08b}'.format(6)
'00000110'

Just to explain the parts of the formatting string:

  • {} places a variable into a string
  • 0 takes the variable at argument position 0
  • : adds formatting options for this variable (otherwise it would represent decimal 6)
  • 08 formats the number to eight digits zero-padded on the left
  • b converts the number to its binary representation

If you're using a version of Python 3.6 or above, you can also use f-strings:

>>> f'{6:08b}'
'00000110'
TrebledJ
  • 8,713
  • 7
  • 26
  • 48
eumiro
  • 207,213
  • 34
  • 299
  • 261
  • 12
    The first `0` means the `0th` argument to `format`. After the colon is the formatting, the second `0` means zero fill to 8 spaces and `b` for binary – jamylak May 02 '12 at 09:39
  • 1
    @Aif: Also, have a look at the standard documentation http://docs.python.org/library/string.html#format-specification-mini-language – pepr May 02 '12 at 10:27
  • 28
    This can be simplified with the [`format()` *function*](http://docs.python.org/2/library/functions.html#format): `format(6, '08b')`; the function takes a value (what the `{..}` slot applies to) and a formatting specification (whatever you would put after the `:` in the formatting string). – Martijn Pieters Sep 11 '13 at 17:33
  • 6
    `'{0:08b}'.format(-6)` -> `'-0000110'`. what if you don't want a sign? [`struct`](https://docs.python.org/2.7/library/struct.html)? `-6%256`? – n611x007 Jun 23 '14 at 11:17
  • 1
    @AK47 Yes, since Pythoon 2.6 you can write int constants in binary form with 0b or 0B prefix: _0b00000110_ – Denis Barmenkov May 11 '17 at 23:13
125

Just another idea:

>>> bin(6)[2:].zfill(8)
'00000110'

Shorter way via string interpolation (Python 3.6+):

>>> f'{6:08b}'
'00000110'
mshsayem
  • 17,557
  • 11
  • 61
  • 69
  • 8
    Note that this solution is [faster than the accepted one](https://ideone.com/5yQc6x). Which solution is more clear (or, dare I say it, Pythonic) is probably a matter of personal taste. – Air Feb 21 '14 at 18:04
  • I'm still learning the essence of pythonicity, but this is clearly much more versatile. I was initially excited to see the accepted solution with its elegant explanation, but alarmed that the object being called on to do the methods was written as a single string with all specifications built in, eliminating the involvement of variables in such things as the desired length of the bitstring. This solves that completely, and is so intuitive (at least for Python 2) that there's no need to explain each character! – Post169 Mar 20 '18 at 16:27
  • Does not work for negative integer `bin(-6)[2:].zfill(8)` reads as `'0000b110'` – jlandercy Dec 14 '19 at 07:19
26

A bit twiddling method...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
marbel82
  • 925
  • 1
  • 18
  • 39
sobel
  • 643
  • 5
  • 8
  • 1
    Nice method. But I couldn't understand what this part of your code is doing: str((x >> i) & 1) – Gregory Sep 24 '16 at 10:17
  • 2
    @Gregory: it shifts the bits in `x` to the right and ANDs it with `1`, effectively extracting one bit (0 or 1) at a time. – Jongware Feb 18 '18 at 12:18
  • Very nice! As an observation, `reversed` could be removed by using `range(7,-1,-1)`; albeit more ‘pure’, but perhaps less readable/intuitive. – S3DEV Sep 22 '21 at 21:38
  • This is the only answer that supports negative numbers (which, since Python stores them in 2's complement, are output in 2's complement format with this method). – Mew Feb 15 '23 at 10:44
23

Just use the format function

format(6, "08b")

The general form is

format(<the_integer>, "<0><width_of_string><format_specifier>")
theOne
  • 411
  • 4
  • 4
  • 2
    Yes, I like this one, it's simple and one of the fastest :-) `1000000 loops, best of 3: 556 ns per loop` – SebMa Jul 12 '17 at 08:45
11

eumiro's answer is better, however I'm just posting this for variety:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
  • 29,432
  • 3
  • 65
  • 92
10

numpy.binary_repr(num, width=None) has a magic width argument

Relevant examples from the documentation linked above:

>>> np.binary_repr(3, width=4)
'0011'

The two’s complement is returned when the input number is negative and width is specified:

>>> np.binary_repr(-3, width=5)
'11101'
Tom Hale
  • 40,825
  • 36
  • 187
  • 242
6

.. or if you're not sure it should always be 8 digits, you can pass it as a parameter:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'
thebjorn
  • 26,297
  • 11
  • 96
  • 138
6

Going Old School always works

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))
  • 1
    `number=number/2` gives float, so `number=number//2` seams better, also I would replace `number=number//2` with `number//=2` and `b=b+"0"` with `b+="0"` – Brambor Nov 12 '19 at 03:46
  • also, you don't have the 0 padding as the OP required – Brambor Nov 12 '19 at 03:48
  • so if `number=7`, your function returns "111" instead of "0111", this is unexpected. – Ye Xu Nov 07 '22 at 16:11
  • true because at 7, you are still in the third bit. essentially the assumption is depending on the size to be received, the entire left side is made of zeroes – Shadrack Kimutai Nov 11 '22 at 06:12
4

The best way is to specify the format.

format(a, 'b')

returns the binary value of a in string format.

To convert a binary string back to integer, use int() function.

int('110', 2)

returns integer value of binary string.

Pranjalya
  • 68
  • 2
  • 7
4

You can use just:

"{0:b}".format(n)

In my opinion this is the easiest way!

Leha
  • 53
  • 6
3

even an easier way

my_num = 6
print(f'{my_num:b}')
Raad Altaie
  • 1,025
  • 1
  • 15
  • 28
2

Assuming you want to parse the number of digits used to represent from a variable which is not always constant, a good way will be to use numpy.binary.

could be useful when you apply binary to power sets

import numpy as np
np.binary_repr(6, width=8)
ama
  • 53
  • 1
  • 7
1
('0' * 7 + bin(6)[2:])[-8:]

or

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
zerg
  • 11
  • 1
  • 4
    While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value. – Nic3500 Sep 05 '18 at 00:31
0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
0

The python package Binary Fractions has a full implementation of binaries as well as binary fractions. You can do your operation as follows:

from binary_fractions import Binary
b = Binary(6) # creates a binary fraction string
b.lfill(8) # fills to length 8

This package has many other methods for manipulating binary strings with full precision.

0

Simple code with recursion:

 def bin(n,number=('')):
   if n==0:
     return(number)
   else:
     number=str(n%2)+number
     n=n//2
     return bin(n,number)
Mabel137
  • 1
  • 2
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Dec 02 '21 at 22:51
0
    def convertToBinary(self, n):
        result=""
        if n==0:
            return 0

        while n>0:
            r=n%2
            result+=str(r)
            n=int(n/2)
        if n%2==0:
            result+="0"
        return result[::-1]
neda
  • 13
  • 3