Velocity Reviews > integer to binary...

# integer to binary...

Grant Edwards
Guest
Posts: n/a

 06-01-2006
On 2006-06-01, Tim Chase <(E-Mail Removed)> 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!

mensanator@aol.com
Guest
Posts: n/a

 06-01-2006

http://www.velocityreviews.com/forums/(E-Mail Removed) 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

Claudio Grondi
Guest
Posts: n/a

 06-02-2006
(E-Mail Removed) wrote:
> (E-Mail Removed) 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/pyt...ry/319295.html
(includes full source code of all compared approaches)

Claudio

Sion Arrowsmith
Guest
Posts: n/a

 06-02-2006
Tim Chase <(E-Mail Removed)> wrote:
>bitCount = len([c for c in "01001010101" if c=="1"])

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

--
\S -- (E-Mail Removed) -- 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

John Salerno
Guest
Posts: n/a

 06-02-2006
(E-Mail Removed) wrote:

> Use the gmpy module.

Yes, it's good.

Bruno Desthuilliers
Guest
Posts: n/a

 06-02-2006
(E-Mail Removed) 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
Guest
Posts: n/a

 06-02-2006
Grant Edwards a écrit :
> On 2006-06-01, (E-Mail Removed) <(E-Mail Removed)> 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
Guest
Posts: n/a

 06-02-2006
(E-Mail Removed) a écrit :
> Grant Edwards wrote:
>
>>On 2006-06-01, (E-Mail Removed) <(E-Mail Removed)> 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 ?

Grant Edwards
Guest
Posts: n/a

 06-03-2006
On 2006-06-02, Bruno Desthuilliers <(E-Mail Removed)> wrote:
> Grant Edwards a écrit :
>> On 2006-06-01, (E-Mail Removed) <(E-Mail Removed)> 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

Tim Chase
Guest
Posts: n/a

 06-03-2006
> 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