13

This function receives as a parameter an integer and should return a list representing the same value expressed in binary as a list of bits, where the first element in the list is the most significant (leftmost) bit.

My function currently outputs '1011' for the number 11, I need [1,0,1,1] instead.

For example,

>>> convert_to_binary(11)
[1,0,1,1]
user1790201
  • 159
  • 1
  • 1
  • 5
  • 1
    Can you please post the code you have so far? This sounds like a homework assignment and posting the code would help us help you better. – GWW Nov 23 '12 at 03:38
  • I keep getting an error message when posting the code in the description – user1790201 Nov 23 '12 at 03:48
  • @user1790201, click the [edit button](http://stackoverflow.com/posts/13522773/edit) that's where you should post your code. – John Nov 23 '12 at 03:53
  • @user1790201: It sounds like you want to ask for the reverse function as well. You can ask that as a separate question instead of adding to an existing question. – Dietrich Epp Nov 23 '12 at 03:59

16 Answers16

19
def trans(x):
    if x == 0: return [0]
    bit = []
    while x:
        bit.append(x % 2)
        x >>= 1
    return bit[::-1]
Jun HU
  • 3,176
  • 6
  • 18
  • 21
12

Just for fun - the solution as a recursive one-liner:

def tobin(x):
    return tobin(x/2) + [x%2] if x > 1 else [x]
Óscar López
  • 232,561
  • 37
  • 312
  • 386
8

may I propose this:

def tobin(x,s):
    return [(x>>k)&1 for k in range(0,s)]

it is probably the fastest way and it seems pretty clear to me. bin way is too slow when performance matters.

cheers

user1811468
  • 111
  • 1
  • 2
2

You can first use the format function to get a binary string like your current function. For e.g the following snippet creates a binary string of 8 bits corresponding to integer 58.

>>>u = format(58, "08b")
'00111010'

Now iterate the string to convert each bit to an int to get your desired list of bits encoded as integers.

>>>[int(d) for d in u]
[0, 0, 1, 1, 1, 0, 1, 0]
theOne
  • 411
  • 4
  • 4
1

You can use numpy package and get very fast solution:

python -m timeit -s "import numpy as np; x=np.array([8], dtype=np.uint8)" "np.unpackbits(x)"
1000000 loops, best of 3: 0.65 usec per loop

python -m timeit "[int(x) for x in list('{0:0b}'.format(8))]"
100000 loops, best of 3: 3.68 usec per loop

unpackbits handles inputs of uint8 type only, but you can still use np.view:

python -m timeit -s "import numpy as np; x=np.array([124567], dtype=np.uint64).view(np.uint8)" "np.unpackbits(x)"
1000000 loops, best of 3: 0.697 usec per loop
bubble
  • 1,634
  • 12
  • 17
0

This will do it. No sense in rolling your own function if there's a builtin.

def binary(x):
    return [int(i) for i in bin(x)[2:]]

The bin() function converts to a string in binary. Strip of the 0b and you're set.

Dietrich Epp
  • 205,541
  • 37
  • 345
  • 415
0

Here is the code for one that I made for college. Click Here for a youtube video of the code.! https://www.youtube.com/watch?v=SGTZzJ5H-CE

__author__ = 'Derek'
print('Int to binary')
intStr = input('Give me an int: ')
myInt = int(intStr)
binStr = ''
while myInt > 0:
    binStr = str(myInt % 2) + binStr
    myInt //= 2
print('The binary of', intStr, 'is', binStr)
print('\nBinary to int')
binStr = input('Give me a binary string: ')
temp = binStr
newInt = 0
power = 0
while len(temp) > 0:   # While the length of the array if greater than zero keep looping through
    bit = int(temp[-1])   # bit is were you temporally store the converted binary number before adding it to the total
    newInt = newInt + bit * 2 ** power  # newInt is the total,  Each time it loops it adds bit to newInt.
    temp = temp[:-1]  # this moves you to the next item in the string.
    power += 1  # adds one to the power each time.
print("The binary number " + binStr, 'as an integer is', newInt)
Derek MC
  • 366
  • 2
  • 4
  • 25
0

Padded with length

In most cases you want your binary number to be a specific length. For example you want 1 to be 8 binary digits long [0,0,0,0,0,0,0,1]. I use this myself:

def convert_to_binary(num, length=8):
    binary_string_list = list(format(num, '0{}b'.format(length)))
    return [int(digit) for digit in binary_string_list]
Cameron Lowell Palmer
  • 21,528
  • 7
  • 125
  • 126
0

Not really the most efficient but at least it provides a simple conceptual way of understanding it...

1) Floor divide all the numbers by two repeatedly until you reach 1

2) Going in reverse order, create bits of this array of numbers, if it is even, append a 0 if it is odd append a 1.

Here's the literal implementation of that:

def intToBin(n):
    nums = [n]
    while n > 1:
        n = n // 2
        nums.append(n)

    bits = []
    for i in nums:
        bits.append(str(0 if i%2 == 0 else 1))
    bits.reverse()
    print ''.join(bits)

Here's a version that better utilizes memory:

def intToBin(n):
    bits = []

    bits.append(str(0 if n%2 == 0 else 1))
    while n > 1:
        n = n // 2
        bits.append(str(0 if n%2 == 0 else 1))

    bits.reverse()
    return ''.join(bits)
ThinkBonobo
  • 15,487
  • 9
  • 65
  • 80
0

Not the pythonic way...but still works:

def get_binary_list_from_decimal(integer, bits):
    '''Return a list of 0's and 1's representing a decimal type integer.

    Keyword arguments:
    integer -- decimal type number.
    bits -- number of bits to represent the integer.

    Usage example:
    #Convert 3 to a binary list
    get_binary_list_from_decimal(3, 4)
    #Return will be [0, 0, 1, 1]
    '''
    #Validate bits parameter.
    if 2**bits <= integer:
        raise ValueError("Error: Number of bits is not sufficient to \
                          represent the integer. Increase bits parameter.")

    #Initialise binary list
    binary_list = []
    remainder = integer
    for i in range(bits-1, -1, -1):
        #If current bit value is less than or equal to the remainder of 
        #the integer then bit value is 1.
        if 2**i <= remainder:
            binary_list.append(1)
            #Subtract the current bit value from the integer.
            remainder = remainder - 2**i
        else:
            binary_list.append(0)

    return binary_list

Example of how to use it:

get_binary_list_from_decimal(1, 3)
#Return will be [0, 0, 1]
theQuestionMan
  • 1,270
  • 2
  • 18
  • 29
0
def nToKBit(n, K=64):
   output = [0]*K

   def loop(n, i):
       if n == 0: 
           return output
       output[-i] = n & 1
       return loop(n >> 1, i+1)

   return loop(n, 1)
Thomas Watson
  • 595
  • 4
  • 8
0

Converting decimal to binary is a matter of how you are going to use the % and //

def getbin(num):
    if (num==0):
        k=[0] 
        return k 
    else:
        s = []
        while(num):
            s.append(num%2)
            num=num//2
        return s
Abpkn
  • 1
  • Although this is technically a new script, this concept has been used by other answers before. Please read [How do I write a good answer?](https://stackoverflow.com/help/how-to-answer) – Mr. T Oct 15 '18 at 09:31
0

Just sharing a function that processes an array of ints:

def to_binary_string(x):
    length = len(bin(max(x))[2:])

    for i in x:
        b = bin(i)[2:].zfill(length)

        yield [int(n) for n in b]

Test:

x1 = to_binary_string([1, 2, 3])
x2 = to_binary_string([1, 2, 3, 4])

print(list(x1)) # [[0, 1], [1, 0], [1, 1]]
print(list(x2)) # [[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0]]
Rendicahya
  • 4,205
  • 7
  • 36
  • 56
0

Convert integer to list of bits with a fixed length :

[int(x) for x in list('{0:0{width}b}'.format(8, width=5))]
florex
  • 943
  • 7
  • 9
0
def dectobin(x):
  i,f=str(x).split('.')
  i1=int(i)
  f1=int(f)
  int1=[]
  dec=[]
  count=0
  while i1>0:
    int1.append(i1%2)
    i1=i1//2
  while f1>0 and count<5:
    f1=f1/10**len(f)
    print(f1)
    f2=f1*2
    i3,f3=str(f2).split('.')
    dec.append(i3)
    f1=int(f3)
    count=count+1
  strint=''
  decint=''
  for x in int1:
    strint=strint+str(x)
  for x in dec:
    decint=decint+str(x)
  return(strint+'.'+decint)

print(dectobin(47.234))

#works

ANISH D
  • 1
  • 1
  • 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 Jul 09 '23 at 17:08
-2
# dec2bin.py
# FB - 201012057
import math

def dec2bin(f):
    if f >= 1:
        g = int(math.log(f, 2))
    else:
        g = -1
    h = g + 1
    ig = math.pow(2, g)
    st = ""    
    while f > 0 or ig >= 1: 
        if f < 1:
            if len(st[h:]) >= 10: # 10 fractional digits max
                   break
        if f >= ig:
            st += "1"
            f -= ig
        else:
            st += "0"
        ig /= 2
    st = st[:h] + "." + st[h:]
    return st

# MAIN
while True:
    f = float(raw_input("Enter decimal number >0: "))
    if f <= 0: break
    print "Binary #: ", dec2bin(f)
    print "bin(int(f)): ", bin(int(f)) # for comparison
ChrisGPT was on strike
  • 127,765
  • 105
  • 273
  • 257
kai
  • 1