How to convert base 10 to base 2?

Ian Kelly ian.g.kelly at gmail.com
Mon Aug 20 14:00:21 EDT 2012


On Mon, Aug 20, 2012 at 11:29 AM, Dennis Lee Bieber
<wlfraed at ix.netcom.com> wrote:
>         I think I typically have done this by going through a hex
> representation.
>
> H2B_Lookup = {  "0" : "0000",   "1" : "0001",
>                                         "2" : "0010",   "3" : "0011",
>                                         "4" : "0100",   "5" : "0101",
>                                         "6" : "0110",   "7" : "0111",
>                                         "8" : "1000",   "9" : "1001",
>                                         "A" : "1010",   "B" : "1011",
>                                         "C" : "1100",   "D" : "1101",
>                                         "D" : "1110",   "F" : "1111"    }
>
> def I2B(i):
>     sgn = " "
>     if i < 0:
>         sgn = "-"
>         i = -i
>     h = ("%X" % i)
>     return sgn + "".join([H2B_Lookup[c] for c in h])
>
>>>> from i2b import I2B
>>>> I2B(10)
> ' 1010'
>>>> I2B(1238)
> ' 010011100110'
>>>> I2B(-6)
> '-0110'
>>>>

I would throw a .lstrip('0') in there to get rid of the ugly leading
zeroes (and also add a special case for i == 0).

Everybody should know the generic algorithm, though:

from itertools import chain

def convert(n, base):
    digits = [chr(x) for x in chain(range(ord('0'), ord('9')+1),
                                    range(ord('A'), ord('Z')+1))]
    if not 2 <= base <= len(digits):
        raise ValueError("invalid base")
    output = []
    sign = ""
    if n < 0:
        n = -n
        sign = "-"
    while n > 0:
        n, r = divmod(n, base)
        output.append(digits[r])
    return sign + ''.join(reversed(output)) or '0'



More information about the Python-list mailing list