Can string formatting be used to convert an integer to its binaryform ?

Discussion in 'Python' started by fdu.xiaojf@gmail.com, Sep 28, 2006.

  1. Guest

    Hi,

    String formatting can be used to converting an integer to its octal or
    hexadecimal form:
    >>> a = 199
    >>> "%o" % a

    '307'
    >>> "%x" % a

    'c7'

    But, can string formatting be used to convert an integer to its binary
    form ?


    Thanks in advance.

    xiaojf
     
    , Sep 28, 2006
    #1
    1. Advertising

  2. flupke Guest

    schreef:
    > Hi,
    >
    > String formatting can be used to converting an integer to its octal or
    > hexadecimal form:
    >>>> a = 199
    >>>> "%o" % a

    > '307'
    >>>> "%x" % a

    > 'c7'
    >
    > But, can string formatting be used to convert an integer to its binary
    > form ?
    >
    >
    > Thanks in advance.
    >
    > xiaojf


    I don't actually know how to do it with string formatting but you can
    create a simple function to do it.
    Here's an example:
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/219300

    Regards,
    Benedict
     
    flupke, Sep 28, 2006
    #2
    1. Advertising

  3. Mirco Wahab Guest

    Thus spoke (on 2006-09-28 09:10):

    > String formatting can be used to converting an integer to its octal or
    > hexadecimal form:
    > >>> a = 199
    > >>> "%o" % a

    > '307'
    > >>> "%x" % a

    > 'c7'
    >
    > But, can string formatting be used to convert an integer to its binary
    > form ?


    I didn't fell over this problem so far but
    I *would* have expected to find something
    like a 'pack' operator (as in Perl).

    And voilá, there is (even basically identical to Perl):

    from struct import *

    a = 199
    a_bin_str = pack('L', a)



    Regards

    Mirco
     
    Mirco Wahab, Sep 28, 2006
    #3
  4. Re: Can string formatting be used to convert an integer to itsbinary form ?

    At Thursday 28/9/2006 05:22, Mirco Wahab wrote:

    > > String formatting can be used to converting an integer to its octal or
    > > hexadecimal form:
    > > >>> a = 199
    > > >>> "%o" % a

    > > '307'
    > > >>> "%x" % a

    > > 'c7'
    > >
    > > But, can string formatting be used to convert an integer to its binary
    > > form ?

    >
    > a = 199
    > a_bin_str = pack('L', a)


    Notice that the OP was looking for another thing, given the examples.
    Perhaps a better wording would have been "how to convert an integer
    to its base-2 string representation".


    Gabriel Genellina
    Softlab SRL





    __________________________________________________
    Preguntá. Respondé. Descubrí.
    Todo lo que querías saber, y lo que ni imaginabas,
    está en Yahoo! Respuestas (Beta).
    ¡Probalo ya!
    http://www.yahoo.com.ar/respuestas
     
    Gabriel Genellina, Sep 28, 2006
    #4
  5. Mirco Wahab Guest

    Re: Can string formatting be used to convert an integer to its binaryform ?

    Thus spoke Gabriel Genellina (on 2006-09-28 11:05):

    > At Thursday 28/9/2006 05:22, Mirco Wahab wrote:
    >> > But, can string formatting be used to convert an integer to its binary
    >> > form ?

    >>
    >> a = 199
    >> a_bin_str = pack('L', a)


    >
    > Notice that the OP was looking for another thing, given the examples.
    > Perhaps a better wording would have been "how to convert an integer
    > to its base-2 string representation".


    Yes, you are right. The OP looks for a
    'binary (bit) representation ..."
    I admit I didn't find out how to format
    a value into a bit string in Python.

    In Perl, this would be a no-brainer:

    $var = 199;
    $str = sprintf "%0*b", 32, $var;

    and str would contain 00000000000000000000000011000111
    on a intel machine.

    But where is the %b in Python?

    Regards & Thanks

    Mirco
     
    Mirco Wahab, Sep 28, 2006
    #5
  6. Guest

    Re: Can string formatting be used to convert an integer to its binary form ?

    Mirco Wahab:
    > But where is the %b in Python?


    Python doesn't have that. You can convert the number to a hex, and then
    map the hex digitds to binary strings using a dictionary, like this:
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528

    Bye,
    bearophile
     
    , Sep 28, 2006
    #6
  7. wrote:
    > Mirco Wahab:
    >
    >> But where is the %b in Python?
    >>

    >
    > Python doesn't have that. You can convert the number to a hex, and then
    > map the hex digitds to binary strings using a dictionary, like this:
    > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528
    >
    > Bye,
    > bearophile
    >
    >

    Good idea, but shorter with ->
    http://cheeseshop.python.org/pypi/SE/2.2 beta

    >>> import SE
    >>> Int_To_Binary = SE.SE (SE.SE ('0=0000 1=0001 2=0010 3=0011 4=0100

    5=0101 6=0110 7=0111 8=1000 9=1001 A=1010 a=1010 B=1011 b=1011 C=1100
    c=1100 D=1101 d=1101 E=1110 e=1110 F=1111 f=1111')
    >>> Int_To_Binary ('%x' % 1234567890')

    '01001001100101100000001011010010'

    >>> Int_To_Binary.save ('se_definition_files/int_to_binary.se')


    >>> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321)

    '00111010110111100110100010110001'


    Frederic
     
    Frederic Rentsch, Sep 28, 2006
    #7
  8. Mirco Wahab Guest

    Thus spoke Frederic Rentsch (on 2006-09-28 20:43):
    > wrote:
    >> Mirco Wahab:
    >>
    >>> But where is the %b in Python?

    >>
    >> Python doesn't have that. ...
    >> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528

    >
    > Good idea, but shorter with ->
    > http://cheeseshop.python.org/pypi/SE/2.2 beta
    > SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321)
    > '00111010110111100110100010110001'


    I don't really understand here:

    - why doesn't have Python such a simple and useful thing as to_binstr(...)
    even C++ has one built in,
    #include <iostream>
    #include <bitset>

    int somefunc()
    {
    int val = 199;
    std::cout << std::bitset<32>( val );
    ...

    - why would you favor such complicated solutions
    for this (as posted), when you can have this
    in one line, e.g.:

    def int2bin(num, width=32):
    return ''.join(['%c'%(ord('0')+bool((1<<k)&num)) for k in range((width-1),-1,-1)])

    (including a string with specifier,this is what I came up with after
    looking up some Python docs - maybe you can straighten this a bit ...)

    -- but my goggles might be biased,
    I don't really emphasize the "Python way" ;-)

    Regards and thanks

    Mirco
     
    Mirco Wahab, Sep 28, 2006
    #8
  9. Mirco Wahab wrote:

    > - why doesn't have Python such a simple and useful thing as to_binstr(...)


    useful? really? for what?

    </F>
     
    Fredrik Lundh, Sep 28, 2006
    #9
  10. Re: Can string formatting be used to convert an integer to its binary form ?

    In <efhdt1$9a1$-halle.de>, Mirco Wahab wrote:

    > Thus spoke Frederic Rentsch (on 2006-09-28 20:43):
    >> wrote:
    >>> Mirco Wahab:
    >>>
    >>>> But where is the %b in Python?
    >>>
    >>> Python doesn't have that. ...
    >>> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528

    >>
    >> Good idea, but shorter with ->
    >> http://cheeseshop.python.org/pypi/SE/2.2 beta
    >> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321)
    >> '00111010110111100110100010110001'

    >
    > I don't really understand here:
    >
    > - why doesn't have Python such a simple and useful thing as to_binstr(...)


    Maybe simple, but useful? And if you really need this it's simple to
    implement or look up in the cook book.

    > - why would you favor such complicated solutions
    > for this (as posted), when you can have this
    > in one line, e.g.:
    >
    > def int2bin(num, width=32):
    > return ''.join(['%c'%(ord('0')+bool((1<<k)&num)) for k in range((width-1),-1,-1)])


    Yeah, I wonder why not everybody sees the beauty in this cool and
    straightforward one liner. ;-)

    Ciao,
    Marc 'BlackJack' Rintsch
     
    Marc 'BlackJack' Rintsch, Sep 28, 2006
    #10
  11. Mirco Wahab Guest

    Thus spoke Marc 'BlackJack' Rintsch (on 2006-09-28 23:38):

    >> def int2bin(num, width=32):
    >> return ''.join(['%c'%(ord('0')+bool((1<<k)&num)) for k in range((width-1),-1,-1)])

    >
    > Yeah, I wonder why not everybody sees the beauty in this cool and
    > straightforward one liner. ;-)


    Right. I see this is BS, maybe lots of these lines exist already,
    one could come up with (sorted by obfuscation, descending):

    def int2bin(num, width=32):
    # return ''.join( [chr(ord('0')+bool(1<<k & num))for k in range(width-1,-1,-1)] )
    # return ''.join( map(lambda k:str(num>>k & 1),range(width-1, -1, -1)) )
    # return ''.join( [str(num>>k & 1)for k in range(width-1, -1, -1)] )

    But after some thinking, I thought about discussing this one:

    def i2b(num, width):
    return str(1 & num>>(width-1)) + i2b(num, width-1) if width else ''

    which is the shortest ;-)

    (Sorry but I'm more or less a newbie, maybe this is BS too ...)

    Regards

    Mirco
     
    Mirco Wahab, Sep 28, 2006
    #11
  12. Mirco Wahab Guest

    Thus spoke Fredrik Lundh (on 2006-09-28 23:35):

    > Mirco Wahab wrote:
    >
    >> - why doesn't have Python such a simple and useful thing as to_binstr(...)

    >
    > useful? really? for what?


    I don't really know, but according to google,
    people often ask exactly for that and there
    is no reason at all why one shouldn't expect
    to get a /bit string/ from "%b" %.

    So if people think it's badly needed, how
    couldn't it be *not* useful then? ;-)

    It feels to me (as it does sometimes
    when diving into Python, to be honest)
    simply as a shortcoming, - and the ter-
    nary operator included in 2.5 was
    imho a huge step forward, next will
    be mutable strings and arrays will be
    'called arrays' somewhere ... ;-)

    (maybe somebody reverses the -v/-V switch too, hey)

    Regards

    Mirco
     
    Mirco Wahab, Sep 28, 2006
    #12
  13. Guest

    Re: Can string formatting be used to convert an integer to its binary form ?

    Frederic Rentsch:
    > Good idea, but shorter with ->
    > >>> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321)

    > '00111010110111100110100010110001'


    Note that your version keeps the leading zeros.
    Have you tested the relative speeds too?
    (I'll probably have to learn to use SE.)

    Bye,
    bearophile
     
    , Sep 29, 2006
    #13
  14. Re: Can string formatting be used to convert an integer to its binary form ?

    In message <>, wrote:

    > Mirco Wahab:
    >> But where is the %b in Python?

    >
    > Python doesn't have that. You can convert the number to a hex, and then
    > map the hex digitds to binary strings using a dictionary, like this:
    > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528


    How about this: (where n is the integer you want to convert):

    "".join([["0", "1"][(1 << i & n) != 0] for i in range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)])
     
    Lawrence D'Oliveiro, Sep 29, 2006
    #14
  15. Re: Can string formatting be used to convert an integer to its binary form ?

    In message <efhril$nrm$>, I wrote:

    > "".join([["0", "1"][(1 << i & n) != 0] for i in range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)])


    Uh, make that

    "".join([["0", "1"][(1 << i & n) != 0] for i in range(int(math.floor(math.log(n, 2))), -1, -1)])

    Need to check those corner cases. :)
     
    Lawrence D'Oliveiro, Sep 29, 2006
    #15
  16. Re: Can string formatting be used to convert an integer to itsbinary form ?

    At Thursday 28/9/2006 22:07, Lawrence D'Oliveiro wrote:

    >How about this: (where n is the integer you want to convert):
    >
    > "".join([["0", "1"][(1 << i & n) != 0] for i in
    > range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)])


    Uhm... so to generate a binary string you have to import the math
    module, convert the integer to float, compute a non-standard
    logarithm, and then...
    What if n<=0?
    Too much, don't you think? :)


    Gabriel Genellina
    Softlab SRL





    __________________________________________________
    Preguntá. Respondé. Descubrí.
    Todo lo que querías saber, y lo que ni imaginabas,
    está en Yahoo! Respuestas (Beta).
    ¡Probalo ya!
    http://www.yahoo.com.ar/respuestas
     
    Gabriel Genellina, Sep 29, 2006
    #16
  17. Re: Can string formatting be used to convert an integer to its binary form ?

    Gabriel Genellina wrote:

    > At Thursday 28/9/2006 22:07, Lawrence D'Oliveiro wrote:
    >
    > >How about this: (where n is the integer you want to convert):
    > >
    > > "".join([["0", "1"][(1 << i & n) != 0] for i in
    > > range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)])

    >
    > Uhm... so to generate a binary string you have to import the math
    > module, convert the integer to float, compute a non-standard
    > logarithm, and then...
    > What if n<=0?
    > Too much, don't you think? :)


    Having recently discovered the joy of obfuscated python thanks to the
    Code Golf challenges, here's the shortest non-recursive function I came
    up with (all integers, signed):

    f=lambda n:'-'[:n<0]+''.join(str(m&1)for m in iter(
    lambda x=[abs(n)]:(x[0],x.__setitem__(0,x[0]>>1))[0],0))[::-1]or'0'

    Any takers ? ;-)

    George
     
    George Sakkis, Sep 29, 2006
    #17
  18. MonkeeSage Guest

    Re: Can string formatting be used to convert an integer to its binary form ?

    So far as unobfuscated versions go, how about the simple:

    def to_bin(x):
    out = []
    while x > 0:
    out.insert(0, str(x % 2))
    x = x / 2
    return ''.join(out)

    Regards,
    Jordan
     
    MonkeeSage, Sep 29, 2006
    #18
  19. Steve Holden Guest

    MonkeeSage wrote:
    > So far as unobfuscated versions go, how about the simple:
    >
    > def to_bin(x):
    > out = []
    > while x > 0:
    > out.insert(0, str(x % 2))
    > x = x / 2
    > return ''.join(out)
    >
    > Regards,
    > Jordan
    >
    >>> to_bin(0)

    ''

    6/10: try harder :)

    regards
    Steve
    --
    Steve Holden +44 150 684 7255 +1 800 494 3119
    Holden Web LLC/Ltd http://www.holdenweb.com
    Skype: holdenweb http://holdenweb.blogspot.com
    Recent Ramblings http://del.icio.us/steve.holden
     
    Steve Holden, Sep 29, 2006
    #19
  20. Paul Rubin Guest

    Re: Can string formatting be used to convert an integer to its binary form ?

    "MonkeeSage" <> writes:
    > def to_bin(x):
    > out = []
    > while x > 0:
    > out.insert(0, str(x % 2))
    > x = x / 2
    > return ''.join(out)


    That returns the empty string for x=0. I'm not sure if that's a bug
    or a feature.

    It also returns the empty string for x < 0, probably a bug.

    It will break in Python 3, where 1 / 2 == 0.5.

    Here's yet another version:

    def to_bin(n):
    if n < 0: return '-' + to_bin(-n)
    if n==0: return '0'
    return ''.join(
    ("0000", "0001", "0010", "0011",
    "0100", "0101", "0110", "0111",
    "1000", "1001", "1010", "1011",
    "1100", "1101", "1110", "1111",)[int(d,16)] \
    for d in '%x'%n).lstrip('0')
     
    Paul Rubin, Sep 29, 2006
    #20
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Polaris431
    Replies:
    8
    Views:
    780
    SM Ryan
    Dec 4, 2006
  2. Casey Hawthorne
    Replies:
    1
    Views:
    744
    Arne Vajhøj
    Mar 18, 2009
  3. thunk
    Replies:
    1
    Views:
    347
    thunk
    Mar 30, 2010
  4. thunk
    Replies:
    0
    Views:
    522
    thunk
    Apr 1, 2010
  5. thunk
    Replies:
    14
    Views:
    655
    thunk
    Apr 3, 2010
Loading...

Share This Page