# integer to binary...

Discussion in 'Python' started by nicolasg@gmail.com, Jun 1, 2006.

1. ### Guest

does anyone know a module or something to convert numbers like integer
to binary format ?

for example I want to convert number 7 to 0111 so I can make some
bitwise operations...

Thanks

, Jun 1, 2006

2. ### =?ISO-8859-1?Q?Sch=FCle_Daniel?=Guest

schrieb:
> does anyone know a module or something to convert numbers like integer
> to binary format ?

unfortunately there is no builtin function for this

>>> int("111",2)

7
>>> str(7)

'7'
>>> str(7,2)

Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: str() takes at most 1 argument (2 given)
>>>

int, str are not symmetrical
I hope this will change in future

<rebel on>

you can use Ruby's 7.to_s(2) for this
irb(main):001:0> 7.to_s(2)
=> "111"
irb(main):002:0> 7.to_s(3)
=> "21"
irb(main):003:0>

</rebel on>

> for example I want to convert number 7 to 0111 so I can make some
> bitwise operations...

you can use bitwise operations on int's anyway

7 & 3 == 3
(1 << 20) | (1 << 10) == 2**20+2**10

and so on

=?ISO-8859-1?Q?Sch=FCle_Daniel?=, Jun 1, 2006

3. ### Alexis RodaGuest

Alexis Roda, Jun 1, 2006
4. ### Grant EdwardsGuest

On 2006-06-01, <> wrote:

> does anyone know a module or something to convert numbers like integer
> to binary format ?

They _are_ in binary format.

> for example I want to convert number 7 to 0111 so I can make some
> bitwise operations...

Just do it:

>>> 7 & 3

3
>>> 7 | 8

15

--
Grant Edwards grante Yow! QUIET!! I'm being
at CREATIVE!! Is it GREAT
visi.com yet? It's s'posed to SMOKEY
THE BEAR...

Grant Edwards, Jun 1, 2006
5. ### Guest

Grant Edwards wrote:
> On 2006-06-01, <> wrote:
>
> > does anyone know a module or something to convert numbers like integer
> > to binary format ?

>
> They _are_ in binary format.
>
> > for example I want to convert number 7 to 0111 so I can make some
> > bitwise operations...

>
> Just do it:
>
> >>> 7 & 3

> 3
> >>> 7 | 8

> 15
>
>
> --

I know I can do that but I need to operate in every bit separeted.
> Grant Edwards grante Yow! QUIET!! I'm being
> at CREATIVE!! Is it GREAT
> visi.com yet? It's s'posed to SMOKEY
> THE BEAR...

, Jun 1, 2006
6. ### Anton VredegoorGuest

wrote:

> does anyone know a module or something to convert numbers like integer
> to binary format ?
>
> for example I want to convert number 7 to 0111 so I can make some
> bitwise operations...

>>> def bits(i,n):

return tuple((0,1)[i>>j & 1] for j in xrange(n-1,-1,-1))

>>> bits(7,4)

(0, 1, 1, 1)

Anton

Anton Vredegoor, Jun 1, 2006
7. ### Grant EdwardsGuest

On 2006-06-01, <> wrote:

>>> does anyone know a module or something to convert numbers like
>>> integer to binary format ?

>>
>> They _are_ in binary format.
>>
>> > for example I want to convert number 7 to 0111 so I can make some
>> > bitwise operations...

>>
>> Just do it:
>>
>> >>> 7 & 3

>> 3
>> >>> 7 | 8

>> 15

>
> I know I can do that but I need to operate in every bit separeted.

Sorry, I've no clue what that means.

--
Grant Edwards grante Yow! Now KEN is having
at a MENTAL CRISIS beacuse
visi.com his "R.V." PAYMENTS are
OVER-DUE!!

Grant Edwards, Jun 1, 2006
8. ### Guest

wrote:
> Grant Edwards wrote:
> > On 2006-06-01, <> wrote:
> >
> > > does anyone know a module or something to convert numbers like integer
> > > to binary format ?

> >
> > They _are_ in binary format.
> >
> > > for example I want to convert number 7 to 0111 so I can make some
> > > bitwise operations...

> >
> > Just do it:
> >
> > >>> 7 & 3

> > 3
> > >>> 7 | 8

> > 15
> >
> >

this is exactly what I need ->
http://www.daniweb.com/code/snippet285.html

thanks.
> > --

> I know I can do that but I need to operate in every bit separeted.
> > Grant Edwards grante Yow! QUIET!! I'm being
> > at CREATIVE!! Is it GREAT
> > visi.com yet? It's s'posed to SMOKEY
> > THE BEAR...

, Jun 1, 2006
9. ### Tim ChaseGuest

>>> for example I want to convert number 7 to 0111 so I can make some
>>> bitwise operations...

>> Just do it:
>>
>>>>> 7 & 3

>> 3
>>>>> 7 | 8

>> 15

> I know I can do that but I need to operate in every bit separeted.

I suppose there might be other operations for which having them
as strings could be handy. E.g. counting bits:

bitCount = len([c for c in "01001010101" if c=="1"])

or parity checking with those counted bits...sure, it can be done
with the raw stuff, but the operations often tend to be more obscure.

Other reasons for wanting an arbitrary integer in binary might be
for plain-old-display, especially if it represents bitmap data.

If you just want to operate on each bit, you can iterate over the
number of bits and shift a single bit to its position:

>>> target = 10
>>> shift = 0
>>> while 1 << shift <= target:

.... print "Bit %i is %i" % (shift,
.... (target & (1 << shift)) >> shift)
.... shift += 1
....
Bit 0 is 0
Bit 1 is 1
Bit 2 is 0
Bit 3 is 1

It's ugly, but it works...

-tkc

Tim Chase, Jun 1, 2006
10. ### Grant EdwardsGuest

On 2006-06-01, <> wrote:

>>>> does anyone know a module or something to convert numbers like integer
>>>> to binary format ?
>>>
>>> They _are_ in binary format.
>>>
>>>> for example I want to convert number 7 to 0111 so I can make
>>>> some bitwise operations...
>>>
>>> Just do it:
>>>
>>> >>> 7 & 3
>>> 3
>>> >>> 7 | 8
>>> 15

>>

> this is exactly what I need -> http://www.daniweb.com/code/snippet285.html

That's nice, but I don't register at web sites like that.

>> I know I can do that but I need to operate in every bit
>> separeted.

I still don't get what you want a binary string for.

I can see wanting a sequence (e.g. array) of boolean values,
but how are you going to do bitwise operations on a binary
string?

--
Grant Edwards grante Yow! .. I think I'd
at better go back to my DESK
visi.com and toy with a few common
MISAPPREHENSIONS...

Grant Edwards, Jun 1, 2006
11. ### Grant EdwardsGuest

On 2006-06-01, Tim Chase <> wrote:
>>>> for example I want to convert number 7 to 0111 so I can make some
>>>> bitwise operations...
>>> Just do it:
>>>
>>>>>> 7 & 3
>>> 3
>>>>>> 7 | 8
>>> 15

>> I know I can do that but I need to operate in every bit separeted.

>
>
> I suppose there might be other operations for which having them
> as strings could be handy. E.g. counting bits:
>
> bitCount = len([c for c in "01001010101" if c=="1"])
>
> or parity checking with those counted bits...sure, it can be done
> with the raw stuff, but the operations often tend to be more obscure.

I would think an array or list of bits would be a lot more
useful for doing "bitwise operations":

bitCount = sum([0,1,0,0,1,0,1,0,1,0,1])
parity = reduce(operator.xor,[0,1,0,0,1,0,1,0,1,0,1])

> Other reasons for wanting an arbitrary integer in binary might be
> for plain-old-display, especially if it represents bitmap data.

Yes. I thought C should have had a %b format since the
beginning, but nobody listens. But that's not
what the OP said he wanted it for.

--
Grant Edwards grante Yow! Now I'm concentrating
at on a specific tank battle
visi.com toward the end of World
War II!

Grant Edwards, Jun 1, 2006
12. ### Guest

wrote:
> does anyone know a module or something to convert numbers like integer
> to binary format ?
>
> for example I want to convert number 7 to 0111 so I can make some
> bitwise operations...
>
> Thanks

Use the gmpy module.

>>> import gmpy
>>> a = 14
>>> b = 7
>>> c = 8

>>> help(gmpy.digits)

Help on built-in function digits:

digits(...)
digits(x[,base]): returns Python string representing x in the
given base (2 to 36, default 10 if omitted or 0); leading '-'
present if x<0, but no leading '+' if x>=0. x must be an mpz,
or else gets coerced into one.

>>> print gmpy.digits(a,2)

1110
>>> print gmpy.digits(b,2)

111
>>> print gmpy.digits(c,2)

1000

>>> help(gmpy.setbit)

Help on built-in function setbit:

setbit(...)
setbit(x,n,v=1): returns a copy of the value of x, with bit n set
to value v; n must be an ordinary Python int, >=0; v, 0 or !=0;
x must be an mpz, or else gets coerced to one.

>>> d = gmpy.setbit(c,1,1)
>>> print gmpy.digits(d,2)

1010

>>> help(gmpy.scan1)

Help on built-in function scan1:

scan1(...)
scan1(x, n=0): returns the bit-index of the first 1-bit of x (that
is at least n); n must be an ordinary Python int, >=0. If no more
1-bits are in x at or above bit-index n (which can only happen for
x>=0, notionally extended with infinite 0-bits), None is returned.
x must be an mpz, or else gets coerced to one.

>>> help(gmpy.scan0)

Help on built-in function scan0:

scan0(...)
scan0(x, n=0): returns the bit-index of the first 0-bit of x (that
is at least n); n must be an ordinary Python int, >=0. If no more
0-bits are in x at or above bit-index n (which can only happen for
x<0, notionally extended with infinite 1-bits), None is returned.
x must be an mpz, or else gets coerced to one.

>>> print gmpy.scan1(a)

1
>>> print gmpy.scan1(b)

0
>>> print gmpy.scan1(c)

3
>>> print gmpy.scan1(d)

1
>>> print gmpy.scan0(a)

0
>>> print gmpy.scan0(b)

3
>>> print gmpy.scan0(c)

0
>>> print gmpy.scan0(d)

0

>>> help(gmpy.popcount)

Help on built-in function popcount:

popcount(...)
popcount(x): returns the number of 1-bits set in x; note that
this is 'infinite' if x<0, and in that case, -1 is returned.
x must be an mpz, or else gets coerced to one.

>>> print gmpy.popcount(a)

3
>>> print gmpy.popcount(b)

3
>>> print gmpy.popcount(c)

1
>>> print gmpy.popcount(d)

2

>>> help(gmpy.hamdist)

Help on built-in function hamdist:

hamdist(...)
hamdist(x,y): returns the Hamming distance (number of bit-positions
where the bits differ) between x and y. x and y must be mpz, or
else
get coerced to mpz.

>>> print gmpy.hamdist(a,b)

2
>>> print gmpy.hamdist(a,c)

2
>>> print gmpy.hamdist(a,d)

1
>>> print gmpy.hamdist(b,c)

4
>>> print gmpy.hamdist(b,d)

3
>>> print gmpy.hamdist(c,d)

1

, Jun 1, 2006
13. ### Claudio GrondiGuest

wrote:
> wrote:
>
>>does anyone know a module or something to convert numbers like integer
>>to binary format ?
>>
>>for example I want to convert number 7 to 0111 so I can make some
>>bitwise operations...
>>
>>Thanks

>
>
> Use the gmpy module.
>
>
>>>>import gmpy
>>>>a = 14
>>>>b = 7
>>>>c = 8

>
>
>>>>help(gmpy.digits)

>
> Help on built-in function digits:
>
> digits(...)
> digits(x[,base]): returns Python string representing x in the
> given base (2 to 36, default 10 if omitted or 0); leading '-'
> present if x<0, but no leading '+' if x>=0. x must be an mpz,
> or else gets coerced into one.
>
>
>>>>print gmpy.digits(a,2)

>
> 1110
>
>>>>print gmpy.digits(b,2)

>
> 111
>
>>>>print gmpy.digits(c,2)

>
> 1000
>
>
>
>>>>help(gmpy.setbit)

>
> Help on built-in function setbit:
>
> setbit(...)
> setbit(x,n,v=1): returns a copy of the value of x, with bit n set
> to value v; n must be an ordinary Python int, >=0; v, 0 or !=0;
> x must be an mpz, or else gets coerced to one.
>
>
>>>>d = gmpy.setbit(c,1,1)
>>>>print gmpy.digits(d,2)

>
> 1010
>
>
>
>
>>>>help(gmpy.scan1)

>
> Help on built-in function scan1:
>
> scan1(...)
> scan1(x, n=0): returns the bit-index of the first 1-bit of x (that
> is at least n); n must be an ordinary Python int, >=0. If no more
> 1-bits are in x at or above bit-index n (which can only happen for
> x>=0, notionally extended with infinite 0-bits), None is returned.
> x must be an mpz, or else gets coerced to one.
>
>
>>>>help(gmpy.scan0)

>
> Help on built-in function scan0:
>
> scan0(...)
> scan0(x, n=0): returns the bit-index of the first 0-bit of x (that
> is at least n); n must be an ordinary Python int, >=0. If no more
> 0-bits are in x at or above bit-index n (which can only happen for
> x<0, notionally extended with infinite 1-bits), None is returned.
> x must be an mpz, or else gets coerced to one.
>
>
>>>>print gmpy.scan1(a)

>
> 1
>
>>>>print gmpy.scan1(b)

>
> 0
>
>>>>print gmpy.scan1(c)

>
> 3
>
>>>>print gmpy.scan1(d)

>
> 1
>
>>>>print gmpy.scan0(a)

>
> 0
>
>>>>print gmpy.scan0(b)

>
> 3
>
>>>>print gmpy.scan0(c)

>
> 0
>
>>>>print gmpy.scan0(d)

>
> 0
>
>
>>>>help(gmpy.popcount)

>
> Help on built-in function popcount:
>
> popcount(...)
> popcount(x): returns the number of 1-bits set in x; note that
> this is 'infinite' if x<0, and in that case, -1 is returned.
> x must be an mpz, or else gets coerced to one.
>
>
>>>>print gmpy.popcount(a)

>
> 3
>
>>>>print gmpy.popcount(b)

>
> 3
>
>>>>print gmpy.popcount(c)

>
> 1
>
>>>>print gmpy.popcount(d)

>
> 2
>
>
>
>>>>help(gmpy.hamdist)

>
> Help on built-in function hamdist:
>
> hamdist(...)
> hamdist(x,y): returns the Hamming distance (number of bit-positions
> where the bits differ) between x and y. x and y must be mpz, or
> else
> get coerced to mpz.
>
>
>>>>print gmpy.hamdist(a,b)

>
> 2
>
>>>>print gmpy.hamdist(a,c)

>
> 2
>
>>>>print gmpy.hamdist(a,d)

>
> 1
>
>>>>print gmpy.hamdist(b,c)

>
> 4
>
>>>>print gmpy.hamdist(b,d)

>
> 3
>
>>>>print gmpy.hamdist(c,d)

>
> 1
>

For those digging deeper into this subject who are looking for speed,
reading the past discussion on this newsgroup I was part of myself
looking for fastest way of such integer to binary conversion can maybe
be of interest:
http://mail.python.org/pipermail/python-list/2006-January/319295.html
(includes full source code of all compared approaches)

Claudio

Claudio Grondi, Jun 2, 2006
14. ### Sion ArrowsmithGuest

Tim Chase <> wrote:
>bitCount = len([c for c in "01001010101" if c=="1"])

bitCount = "01001010101".count("1")

--
\S -- -- http://www.chaos.org.uk/~sion/
___ | "Frankly I have no feelings towards penguins one way or the other"
\X/ | -- Arthur C. Clarke
her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump

Sion Arrowsmith, Jun 2, 2006
15. ### John SalernoGuest

wrote:

> Use the gmpy module.

Yes, it's good.

John Salerno, Jun 2, 2006
16. ### Bruno DesthuilliersGuest

a écrit :
> does anyone know a module or something to convert numbers like integer
> to binary format ?
>
> for example I want to convert number 7 to 0111 so I can make some
> bitwise operations...

You don't need to convert anything. The bitwise ops are &, |, <<, >>

0 | 2 | 4
-> 6
6 & 2
-> 2
2 << 4
-> 32
8 >> 1
-> 4

Bruno Desthuilliers, Jun 3, 2006
17. ### Bruno DesthuilliersGuest

Grant Edwards a écrit :
> On 2006-06-01, <> wrote:
>
>
>>does anyone know a module or something to convert numbers like integer
>>to binary format ?

>
>
> They _are_ in binary format.

Not really.

>>> (7).__class__

<type 'int'>
>>> dir((7))

['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__',
'__delattr__', '__div__', '__divmod__', '__doc__', '__float__',
'__floordiv__', '__getattribute__', '__getnewargs__', '__hash__',
'__hex__', '__init__', '__int__', '__invert__', '__long__',
'__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__',
'__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__',
'__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
'__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
'__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
'__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
>>>

Bruno Desthuilliers, Jun 3, 2006
18. ### Bruno DesthuilliersGuest

a écrit :
> Grant Edwards wrote:
>
>>On 2006-06-01, <> wrote:
>>
>>
>>>does anyone know a module or something to convert numbers like integer
>>>to binary format ?

>>
>>They _are_ in binary format.
>>
>>
>>>for example I want to convert number 7 to 0111 so I can make some
>>>bitwise operations...

>>
>>Just do it:
>>
>>
>>>>>7 & 3

>>
>>3
>>
>>>>>7 | 8

>>
>>15
>>
>>
>>--

>
> I know I can do that but I need to operate in every bit separeted.

Could you explain the difference ?

Bruno Desthuilliers, Jun 3, 2006
19. ### Grant EdwardsGuest

On 2006-06-02, Bruno Desthuilliers <> wrote:
> Grant Edwards a écrit :
>> On 2006-06-01, <> wrote:
>>
>>
>>>does anyone know a module or something to convert numbers like integer
>>>to binary format ?

>>
>>
>> They _are_ in binary format.

>
> Not really.

Yes, really. Otherwise the bitwise boolean operations you
demonstrated wouldn't work as shown.

>>>> (7).__class__

><type 'int'>
>>>> dir((7))

> ['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__',
> '__delattr__', '__div__', '__divmod__', '__doc__', '__float__',
> '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__',
> '__hex__', '__init__', '__int__', '__invert__', '__long__',
> '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__',
> '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__',
> '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
> '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
> '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
> '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
>>>>

The fact that they impliment the xor operator is pretty much
proof that integers are stored in binary format -- xor is only
defined for binary numbers.

--
Grant Edwards grante Yow! ... Blame it on the
at BOSSA NOVA!!!
visi.com

Grant Edwards, Jun 3, 2006
20. ### Tim ChaseGuest

> The fact that they impliment the xor operator is pretty much
> proof that integers are stored in binary format -- xor is only
> defined for binary numbers.

Um...let's not use bad logic/proofs for evidencing this...

>>> hasattr(set(), "__xor__")

True

-tkc

Tim Chase, Jun 3, 2006