Convert base-2 binary number string to int

Python

Python Problem Overview


I'd simply like to convert a base-2 binary number string into an int, something like this:

>>> '11111111'.fromBinaryToInt()
255

Is there a way to do this in Python?

Python Solutions


Solution 1 - Python

You use the built-in int() function, and pass it the base of the input number, i.e. 2 for a binary number:

>>> int('11111111', 2)
255

Here is documentation for Python 2, and for Python 3.

Solution 2 - Python

Just type 0b11111111 in python interactive interface:

>>> 0b11111111
    255

Solution 3 - Python

Another way to do this is by using the bitstring module:

>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255

Note that the unsigned integer is different from the signed integer:

>>> b.int
-1

The bitstring module isn't a requirement, but it has lots of performant methods for turning input into and from bits into other forms, as well as manipulating them.

Solution 4 - Python

Using int with base is the right way to go. I used to do this before I found int takes base also. It is basically a reduce applied on a list comprehension of the primitive way of converting binary to decimal ( e.g. 110 = 2**0 * 0 + 2 ** 1 * 1 + 2 ** 2 * 1)

add = lambda x,y : x + y
reduce(add, [int(x) * 2 ** y for x, y in zip(list(binstr), range(len(binstr) - 1, -1, -1))])


Solution 5 - Python

If you wanna know what is happening behind the scene, then here you go.

class Binary():
    def __init__(self, binNumber):
    	self._binNumber = binNumber
    	self._binNumber = self._binNumber[::-1]
    	self._binNumber = list(self._binNumber)
    	self._x = [1]
    	self._count = 1
    	self._change = 2
    	self._amount = 0
    	print(self._ToNumber(self._binNumber))
    def _ToNumber(self, number):
    	self._number = number
    	for i in range (1, len (self._number)):
    		self._total = self._count * self._change
    		self._count = self._total
    		self._x.append(self._count)
    	self._deep = zip(self._number, self._x)
    	for self._k, self._v in self._deep:
    		if self._k == '1':
    			self._amount += self._v
    	return self._amount

mo = Binary('101111110')

Solution 6 - Python

A recursive Python implementation:

def int2bin(n):
    return int2bin(n >> 1) + [n & 1] if n > 1 else [1] 

Solution 7 - Python

> If you are using python3.6 or later you can use f-string to do the > conversion:

Binary to decimal:

>>> print(f'{0b1011010:#0}')
90

>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90

binary to octal hexa and etc.

>>> f'{0b1011010:#o}'
'0o132'  # octal

>>> f'{0b1011010:#x}'
'0x5a'   # hexadecimal

>>> f'{0b1011010:#0}'
'90'     # decimal

Pay attention to 2 piece of information separated by colon.

In this way, you can convert between {binary, octal, hexadecimal, decimal} to {binary, octal, hexadecimal, decimal} by changing right side of colon[:]

:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal 
:#0 -> converts to decimal as above example

Try changing left side of colon to have octal/hexadecimal/decimal.

Solution 8 - Python

For large matrix (10**5 rows and up) it is better to use a vectorized matmult. Pass in all rows and cols in one shot. It is extremely fast. There is no looping in python here. I originally designed it for converting many binary columns like 0/1 for like 10 different genre columns in MovieLens into a single integer for each example row.

def BitsToIntAFast(bits):
  m,n = bits.shape
  a = 2**np.arange(n)[::-1]  # -1 reverses array of powers of 2 of same length as bits
  return bits @ a

Solution 9 - Python

For the record to go back and forth in basic python3:

a = 10
bin(a)
# '0b1010'

int(bin(a), 2)
# 10
eval(bin(a))
# 10

Solution 10 - Python

Here's another concise way to do it not mentioned in any of the above answers:

>>> eval('0b' + '11111111')
255

Admittedly, it's probably not very fast, and it's a very very bad idea if the string is coming from something you don't have control over that could be malicious (such as user input), but for completeness' sake, it does work.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNaftuli KayView Question on Stackoverflow
Solution 1 - PythonunwindView Answer on Stackoverflow
Solution 2 - PythonlengxuehxView Answer on Stackoverflow
Solution 3 - PythonAlex ReynoldsView Answer on Stackoverflow
Solution 4 - PythonSaurabh HiraniView Answer on Stackoverflow
Solution 5 - PythonMohammad MahjoubView Answer on Stackoverflow
Solution 6 - PythonLudovic TrottierView Answer on Stackoverflow
Solution 7 - PythonRobert RanjanView Answer on Stackoverflow
Solution 8 - PythonGeoffrey AndersonView Answer on Stackoverflow
Solution 9 - PythonClementWalterView Answer on Stackoverflow
Solution 10 - PythonThe Zach ManView Answer on Stackoverflow