# 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
>>> a = 199
>>> "%o" % a

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

'c7'

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

xiaojf

, Sep 28, 2006

2. ### flupkeGuest

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

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

> 'c7'
>
> But, can string formatting be used to convert an integer to its binary
> form ?
>
>
>
> 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

3. ### Mirco WahabGuest

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

> String formatting can be used to converting an integer to its octal or
> >>> 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
4. ### Gabriel GenellinaGuest

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
> > >>> 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
5. ### Mirco WahabGuest

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
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
7. ### Frederic RentschGuest

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
8. ### Mirco WahabGuest

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
9. ### Fredrik LundhGuest

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
10. ### Marc 'BlackJack' RintschGuest

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
11. ### Mirco WahabGuest

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
12. ### Mirco WahabGuest

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
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'

Have you tested the relative speeds too?
(I'll probably have to learn to use SE.)

Bye,
bearophile

, Sep 29, 2006
14. ### Lawrence D'OliveiroGuest

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

"".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
15. ### Lawrence D'OliveiroGuest

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
16. ### Gabriel GenellinaGuest

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

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

>
> "".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
17. ### George SakkisGuest

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:
>
> >
> > "".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
18. ### MonkeeSageGuest

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
19. ### Steve HoldenGuest

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
20. ### Paul RubinGuest

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