Asked 13 years, 5 months ago
Viewed 1.1m times
Are there any canned Python methods to convert an Integer [or Long] into a binary string in Python?
There are a myriad of dec2bin[] functions out on Google... But I was hoping I could use a built-in function / library.
dreftymac
30.3k26 gold badges115 silver badges177 bronze badges
asked Mar 31, 2009 at 3:04
1
If you're looking for bin[]
as an equivalent to
hex[]
, it was added in python 2.6.
Example:
>>> bin[10]
'0b1010'
Akseli Palén
26.2k9 gold badges62 silver badges72 bronze badges
answered Mar 31, 2009 at 3:17
John FouhyJohn Fouhy
39.9k19 gold badges62 silver badges77 bronze badges
5
Python actually does have something already built in for this, the ability to do operations such as '{0:b}'.format[42]
, which will give you the bit pattern [in a string] for 42
, or 101010
.
For a more general philosophy, no language or library will give its user base everything that they desire. If you're working in an environment that doesn't provide exactly what you need, you should be collecting snippets of code as you develop to ensure you never have to write the same thing twice. Such as, for example, the pseudo-code:
define intToBinString, receiving intVal:
if intVal is equal to zero:
return "0"
set strVal to ""
while intVal is greater than zero:
if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
which will construct your binary string based on the decimal value. Just keep in mind that's a generic bit of pseudo-code which may not be the most efficient way of doing it though, with the iterations you seem to be proposing, it won't make much difference. It's really just meant as a guideline on how it could be done.
The general idea is to use code from [in order of preference]:
- the language or built-in libraries.
- third-party libraries with suitable licenses.
- your own collection.
- something new you need to write [and save in your own collection for later].
answered Mar 31, 2009 at 3:25
paxdiablopaxdiablo
826k227 gold badges1547 silver badges1915 bronze badges
5
If you want a textual representation without the 0b-prefix, you could use this:
get_bin = lambda x: format[x, 'b']
print[get_bin[3]]
>>> '11'
print[get_bin[-3]]
>>> '-11'
When you want a n-bit representation:
get_bin = lambda x, n: format[x, 'b'].zfill[n]
>>> get_bin[12, 32]
'00000000000000000000000000001100'
>>> get_bin[-12, 32]
'-00000000000000000000000000001100'
Alternatively, if you prefer having a function:
def get_bin[x, n=0]:
"""
Get the binary representation of x.
Parameters
----------
x : int
n : int
Minimum number of digits. If x needs less digits in binary, the rest
is filled with zeros.
Returns
-------
str
"""
return format[x, 'b'].zfill[n]
answered Feb 12, 2014 at 15:33
Martin ThomaMartin Thoma
112k148 gold badges568 silver badges873 bronze badges
9
I am surprised there is no mention of a nice way to accomplish this using formatting strings that are supported in Python 3.6 and higher. TLDR:
>>> number = 1
>>> f'0b{number:08b}'
'0b00000001'
Longer story
This is functionality of formatting strings available from Python 3.6:
>>> x, y, z = 1, 2, 3
>>> f'{x} {y} {2*z}'
'1 2 6'
You can request binary as well:
>>> f'{z:b}'
'11'
Specify the width:
>>> f'{z:8b}'
' 11'
Request zero padding:
f'{z:08b}'
'00000011'
And add common prefix to signify binary number:
>>> f'0b{z:08b}'
'0b00000011'
You can also let Python add the prefix for you but I do not like it so much as the version above because you have to take the prefix into width consideration:
>>> f'{z:#010b}'
'0b00000011'
More info is available in official documentation on Formatted string literals and Format Specification Mini-Language.
answered Aug 19, 2020 at 10:37
Roman PavelkaRoman Pavelka
3,0041 gold badge9 silver badges26 bronze badges
4
As a reference:
def toBinary[n]:
return ''.join[str[1 & int[n] >> i] for i in range[64][::-1]]
This function can convert a positive
integer as large as 18446744073709551615
, represented as string '1111111111111111111111111111111111111111111111111111111111111111'
.
It can be modified to serve a much larger integer, though it may not be as handy as "{0:b}".format[]
or bin[]
.
answered Dec 17, 2013 at 19:39
kctong529kctong529
8488 silver badges10 bronze badges
2
This is for python 3 and it keeps the leading zeros !
print[format[0, '08b']]
answered Nov 13, 2018 at 7:04
grepitgrepit
19.5k6 gold badges98 silver badges79 bronze badges
3
A simple way to do that is to use string format, see this page.
>> "{0:b}".format[10]
'1010'
And if you want to have a fixed length of the binary string, you can use this:
>> "{0:{fill}8b}".format[10, fill='0']
'00001010'
If two's complement is required, then the following line can be used:
'{0:{fill}{width}b}'.format[[x + 2**n] % 2**n, fill='0', width=n]
where n is the width of the binary string.
answered Jan 19, 2016 at 21:29
XiangXiang
4014 silver badges4 bronze badges
0
one-liner with lambda:
>>> binary = lambda n: '' if n==0 else binary[n/2] + str[n%2]
test:
>>> binary[5]
'101'
EDIT:
but then :[
t1 = time[]
for i in range[1000000]:
binary[i]
t2 = time[]
print[t2 - t1]
# 6.57236599922
in compare to
t1 = time[]
for i in range[1000000]:
'{0:b}'.format[i]
t2 = time[]
print[t2 - t1]
# 0.68017411232
answered Jun 15, 2015 at 2:12
Aziz AltoAziz Alto
17.5k4 gold badges71 silver badges57 bronze badges
2
As the preceding answers mostly used format[], here is an f-string implementation.
integer = 7
bit_count = 5
print[f'{integer:0{bit_count}b}']
Output:
00111
For convenience here is the python docs link for formatted string literals: //docs.python.org/3/reference/lexical_analysis.html#f-strings.
answered Jun 7, 2019 at 20:41
John ForbesJohn Forbes
1,16812 silver badges17 bronze badges
Summary of alternatives:
n=42
assert "-101010" == format[-n, 'b']
assert "-101010" == "{0:b}".format[-n]
assert "-101010" == [lambda x: x >= 0 and str[bin[x]][2:] or "-" + str[bin[x]][3:]][-n]
assert "0b101010" == bin[n]
assert "101010" == bin[n][2:] # But this won't work for negative numbers.
Contributors include John Fouhy, Tung Nguyen, mVChr, Martin Thoma. and Martijn Pieters.
1
>>> format[123, 'b']
'1111011'
answered Dec 7, 2018 at 15:17
Sandu UrsuSandu Ursu
1,0811 gold badge16 silver badges26 bronze badges
0
For those of us who need to convert signed integers [range -2**[digits-1] to 2**[digits-1]-1] to 2's complement binary strings, this works:
def int2bin[integer, digits]:
if integer >= 0:
return bin[integer][2:].zfill[digits]
else:
return bin[2**digits + integer][2:]
This produces:
>>> int2bin[10, 8]
'00001010'
>>> int2bin[-10, 8]
'11110110'
>>> int2bin[-128, 8]
'10000000'
>>> int2bin[127, 8]
'01111111'
Daniel
3,11313 silver badges33 bronze badges
answered Dec 18, 2018 at 19:32
DeanMDeanM
4,4671 gold badge9 silver badges10 bronze badges
you can do like that :
bin[10][2:]
or :
f = str[bin[10]]
c = []
c.append["".join[map[int, f[2:]]]]
print c
answered Jun 21, 2018 at 22:19
Skiller DzSkiller Dz
87910 silver badges17 bronze badges
1
Using numpy pack/unpackbits, they are your best friends.
Examples
--------
>>> a = np.array[[[2], [7], [23]], dtype=np.uint8]
>>> a
array[[[ 2],
[ 7],
[23]], dtype=uint8]
>>> b = np.unpackbits[a, axis=1]
>>> b
array[[[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8]
answered Aug 27, 2015 at 3:39
pitfallpitfall
2,43120 silver badges21 bronze badges
2
Yet another solution with another algorithm, by using bitwise operators.
def int2bin[val]:
res=''
while val>0:
res += str[val&1]
val=val>>1 # val=val/2
return res[::-1] # reverse the string
A faster version without reversing the string.
def int2bin[val]:
res=''
while val>0:
res = chr[[val&1] + 0x30] + res
val=val>>1
return res
answered Oct 18, 2014 at 22:45
Reza AbtinReza Abtin
2053 silver badges7 bronze badges
1
The accepted answer didn't address negative numbers, which I'll cover. In addition to the answers above, you can also just use the bin and hex functions. And in the opposite direction, use binary notation:
>>> bin[37]
'0b100101'
>>> 0b100101
37
But with negative numbers, things get a bit more complicated. The question doesn't specify how you want to handle negative numbers.
Python just adds a negative sign so the result for -37 would be this:
>>> bin[-37]
'-0b100101'
In computer/hardware binary data, negative signs don't exist. All we have is 1's and 0's. So if you're reading or producing binary streams of data to be processed by other software/hardware, you need to first know the notation being used.
One notation is sign-magnitude notation, where the first bit represents the negative sign, and the rest is
the actual value. In that case, -37 would be 0b1100101
and 37 would be 0b0100101
. This looks like what python produces, but just add a 0 or 1 in front for positive / negative numbers.
More common is Two's complement notation, which seems more complicated and the result is very different from python's string formatting. You can read the details in the link, but with an
8bit signed integer -37 would be 0b11011011
and 37 would be 0b00100101
.
Python has no easy way to produce these binary representations. You can use numpy to turn Two's complement binary values into python integers:
>>> import numpy as np
>>> np.int8[0b11011011]
-37
>>> np.uint8[0b11011011]
219
>>> np.uint8[0b00100101]
37
>>> np.int8[0b00100101]
37
But I don't know an easy way to do the opposite with builtin functions. The bitstring package can help though.
>>> from bitstring import BitArray
>>> arr = BitArray[int=-37, length=8]
>>> arr.uint
219
>>> arr.int
-37
>>> arr.bin
'11011011'
>>> BitArray[bin='11011011'].int
-37
>>> BitArray[bin='11011011'].uint
219
answered Jun 26, 2020 at 2:49
Dolf AndringaDolf Andringa
1,9031 gold badge19 silver badges34 bronze badges
Python 3.6 added a new string formatting approach called formatted string literals or “f-strings”. Example:
name = 'Bob'
number = 42
f"Hello, {name}, your number is {number:>08b}"
Output will be 'Hello, Bob, your number is 00001010!'
A discussion of this question can be found here - Here
answered Oct 27, 2020 at 13:47
Tim UzlovTim Uzlov
1612 silver badges5 bronze badges
Unless I'm misunderstanding what you mean by binary string I think the module you are looking for is struct
answered Mar 31, 2009 at 3:08
Van GaleVan Gale
43.1k9 gold badges68 silver badges80 bronze badges
1
n=input[]
print[bin[n].replace["0b", ""]]
answered Nov 29, 2014 at 12:45
0
def binary[decimal] :
otherBase = ""
while decimal != 0 :
otherBase = str[decimal % 2] + otherBase
decimal //= 2
return otherBase
print binary[10]
output:
1010
answered Oct 4, 2014 at 2:07
mukundanmukundan
991 silver badge1 bronze badge
numpy.binary_repr[num, width=None]
Examples from the documentation link above:
>>> np.binary_repr[3] '11' >>> np.binary_repr[-3] '-11' >>> 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=3] '101' >>> np.binary_repr[-3, width=5] '11101'
answered Apr 30, 2019 at 9:28
Tom HaleTom Hale
35.2k27 gold badges163 silver badges224 bronze badges
Here is the code I've just implemented. This is not a method but you can use it as a ready-to-use function!
def inttobinary[number]:
if number == 0:
return str[0]
result =""
while [number != 0]:
remainder = number%2
number = number/2
result += str[remainder]
return result[::-1] # to invert the string
answered Mar 15, 2014 at 13:18
quentsquents
1013 silver badges8 bronze badges
0
Somewhat similar solution
def to_bin[dec]:
flag = True
bin_str = ''
while flag:
remainder = dec % 2
quotient = dec / 2
if quotient == 0:
flag = False
bin_str += str[remainder]
dec = quotient
bin_str = bin_str[::-1] # reverse the string
return bin_str
answered Apr 26, 2014 at 12:42
here is simple solution using the divmod[] fucntion which returns the reminder and the result of a division without the fraction.
def dectobin[number]:
bin = ''
while [number >= 1]:
number, rem = divmod[number, 2]
bin = bin + str[rem]
return bin
answered Jul 18, 2014 at 14:35
1
Here's yet another way using regular math, no loops, only recursion. [Trivial case 0 returns nothing].
def toBin[num]:
if num == 0:
return ""
return toBin[num//2] + str[num%2]
print [[[toBin[i]] for i in range[10]]]
['', '1', '10', '11', '100', '101', '110', '111', '1000', '1001']
answered Oct 23, 2015 at 12:53
ergonautergonaut
6,7631 gold badge15 silver badges46 bronze badges
1
Calculator with all neccessary functions for DEC,BIN,HEX: [made and tested with Python 3.5]
You can change the input test numbers and get the converted ones.
# CONVERTER: DEC / BIN / HEX
def dec2bin[d]:
# dec -> bin
b = bin[d]
return b
def dec2hex[d]:
# dec -> hex
h = hex[d]
return h
def bin2dec[b]:
# bin -> dec
bin_numb="{0:b}".format[b]
d = eval[bin_numb]
return d,bin_numb
def bin2hex[b]:
# bin -> hex
h = hex[b]
return h
def hex2dec[h]:
# hex -> dec
d = int[h]
return d
def hex2bin[h]:
# hex -> bin
b = bin[h]
return b
## TESTING NUMBERS
numb_dec = 99
numb_bin = 0b0111
numb_hex = 0xFF
## CALCULATIONS
res_dec2bin = dec2bin[numb_dec]
res_dec2hex = dec2hex[numb_dec]
res_bin2dec,bin_numb = bin2dec[numb_bin]
res_bin2hex = bin2hex[numb_bin]
res_hex2dec = hex2dec[numb_hex]
res_hex2bin = hex2bin[numb_hex]
## PRINTING
print['------- DECIMAL to BIN / HEX -------\n']
print['decimal:',numb_dec,'\nbin: ',res_dec2bin,'\nhex: ',res_dec2hex,'\n']
print['------- BINARY to DEC / HEX -------\n']
print['binary: ',bin_numb,'\ndec: ',numb_bin,'\nhex: ',res_bin2hex,'\n']
print['----- HEXADECIMAL to BIN / HEX -----\n']
print['hexadec:',hex[numb_hex],'\nbin: ',res_hex2bin,'\ndec: ',res_hex2dec,'\n']
answered Aug 29, 2017 at 8:11
HKC72HKC72
4621 gold badge8 silver badges18 bronze badges
To calculate binary of numbers:
print["Binary is {0:>08b}".format[16]]
To calculate the Hexa decimal of a number:
print["Hexa Decimal is {0:>0x}".format[15]]
To Calculate all the binary no till 16::
for i in range[17]:
print["{0:>2}: binary is {0:>08b}".format[i]]
To calculate Hexa decimal no till 17
for i in range[17]:
print["{0:>2}: Hexa Decimal is {0:>0x}".format[i]]
##as 2 digit is enogh for hexa decimal representation of a number
answered Apr 3, 2018 at 16:16
try:
while True:
p = ""
a = input[]
while a != 0:
l = a % 2
b = a - l
a = b / 2
p = str[l] + p
print[p]
except:
print ["write 1 number"]
answered Apr 27, 2017 at 8:53
Advay168Advay168
5486 silver badges9 bronze badges
1
I found a method using matrix operation to convert decimal to binary.
import numpy as np
E_mat = np.tile[E,[1,M]]
M_order = pow[2,[M-1-np.array[range[M]]]].T
bindata = np.remainder[np.floor[E_mat /M_order].astype[np.int],2]
E
is input decimal data,M
is the binary orders. bindata
is output binary data, which is in a format of 1 by M binary matrix.
answered May 29, 2018 at 20:22