201

Is there any module or function in python I can use to convert a decimal number to its binary equivalent? I am able to convert binary to decimal using int('[binary_value]',2), so any way to do the reverse without writing the code to do it myself?

3
  • 1
    Unlike the linked question "convert to binary string", I think this question is different. I came here looking to convert an integer to a corresponding binary array (or boolean array), and I think that would be a sensible answer. Commented Jan 16, 2020 at 20:57
  • 1
    @SanjayManohar The pure string processing algorithm found here could be adapted to do what you want. Commented Mar 15, 2020 at 17:11
  • "I am able to convert binary to decimal using int('[binary_value]',2)": no you aren't. That converts a string representation of binary to integer, and most probably what you are really looking for is the reverse. Decimal has nothing to do with it either way. Computers store numbers in binary. Commented Aug 29 at 1:00

8 Answers 8

293

all numbers are stored in binary. if you want a textual representation of a given number in binary, use bin(i)

>>> bin(10)
'0b1010'
>>> 0b1010
10
Sign up to request clarification or add additional context in comments.

2 Comments

Misleading. bin() returns binary string, not binary
@hiperbolt could use a link to a non-misleading solution
92

Without the 0b in front:

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

Starting with Python 3.6 you can also use formatted string literal or f-string, --- PEP:

f"{int_value:b}"

5 Comments

I got the following error: TypeError: non-empty format string passed to object.__format__
same for me with python 3.5.2 TypeError: non-empty format string passed to object.__format__ ahh - now i got it, what you meant: ```>>> "{0:b}".format(47) ---> '101111'
You also can determine amount of bits that it will be represented in this way:>>> "{:0>15b}".format(3) >>> '000000000000011'
can also format(int_value, 'b')
the solution is incorrect with value < 0
83
"{0:#b}".format(my_int)

3 Comments

Here's the format for printing with leading zero's: "{0:08b}".format(my_int)
@WaldoBronchart thats cool. Can you explain to me how does that work, having the leading zeros? Is that inbuilt, that you get the leading zeros with 0+8 or 0+16?
@AlexandreAllegro the 08 indicates how many digits of precision you want.
54
def dec_to_bin(x):
    return int(bin(x)[2:])

It's that easy.

7 Comments

-1 - don't return an int. Also, dec_to_bin(-1) gives ValueError: invalid literal for int() with base 10: 'b1'
can you explain that [2:] ?
Try bin(2). You don't get '10'. You get '0b10'. Same possible pit with hex(2) ('0x2'). So you want all but the first two characters. So you take a slice that starts after the first two characters.
@zero_cool if test_var = "Hello world" then test_var[2:] = "llo world"
@Wallace: because binary and decimal are a choice of how to show the number, not part of the number itself. dec_to_bin(0b101) == 101, which is nonsense because none of operations you can apply to 101 have any relation to the original 5 - for instance, dec_to_bin(0b101) + 1 == 102.
|
20

You can also use a function from the numpy module

from numpy import binary_repr

which can also handle leading zeros:

Definition:     binary_repr(num, width=None)
Docstring:
    Return the binary representation of the input number as a string.

    This is equivalent to using base_repr with base 2, but about 25x
    faster.

    For negative numbers, if width is not given, a - sign is added to the
    front. If width is given, the two's complement of the number is
    returned, with respect to that width.

Comments

13

I agree with @aaronasterling's answer. However, if you want a non-binary string that you can cast into an int, then you can use the canonical algorithm:

def decToBin(n):
    if n==0: return ''
    else:
        return decToBin(n/2) + str(n%2)

6 Comments

int(bin(10), 2) yields 10. int(decToBin(10)) yields 101 and int(decToBin(10), 2) yields 5. Also, your function hit's recursion limits with from __future__ import division or python 3
@aaron, the latter point can be solved by switching to // (truncating division); the former, by switching the order of the two strings being summed in the return. Not that recursion makes any sense here anyway (bin(n)[2:] -- or a while loop if you're stuck on some old version of Python -- will be much better!).
This is awesome! it could go with the lambda way too :] binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)
@AzizAlto I get a busload full of numbers with lots of e-, also in the recursive call dectobin.
@Timo lol apparently you are using Python3 just change binary(n/2) to binary(n//2) then you won't get that busload :-)
|
9
n=int(input('please enter the no. in decimal format: '))
x=n
k=[]
while (n>0):
    a=int(float(n%2))
    k.append(a)
    n=(n-a)/2
k.append(0)
string=""
for j in k[::-1]:
    string=string+str(j)
print('The binary no. for %d is %s'%(x, string))

Comments

2

For the sake of completion: if you want to convert fixed point representation to its binary equivalent you can perform the following operations:

  1. Get the integer and fractional part.

    from decimal import *
    a = Decimal(3.625)
    a_split = (int(a//1),a%1)
    
  2. Convert the fractional part in its binary representation. To achieve this multiply successively by 2.

    fr = a_split[1]
    str(int(fr*2)) + str(int(2*(fr*2)%1)) + ...
    

You can read the explanation here.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.