473,395 Members | 1,763 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Fastest way to convert a byte of integer into a list

Hello,

I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:

num = 255
numList = [1,1,1,1,1,1,1,1]

with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?

Jul 12 '07 #1
12 5036
On Jul 12, 3:34 pm, Godzilla <godzillais...@gmail.comwrote:
Hello,

I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:

num = 255
numList = [1,1,1,1,1,1,1,1]

with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?
num = 255
numlist = [num >i & 1 for i in range(8)]

Jul 12 '07 #2
On Jul 13, 9:54 am, Matimus <mccre...@gmail.comwrote:
On Jul 12, 3:34 pm, Godzilla <godzillais...@gmail.comwrote:
Hello,
I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:
num = 255
numList = [1,1,1,1,1,1,1,1]
with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?

num = 255
numlist = [num >i & 1 for i in range(8)]
Thanks matimus! I will look into it...

Jul 13 '07 #3
Godzilla <go***********@gmail.comwrites:
num = 255
numlist = [num >i & 1 for i in range(8)]

Thanks matimus! I will look into it...
numlist = lookup_table[num]

where lookup_table is a precomputed list of lists.
Jul 13 '07 #4
On Jul 13, 10:28 am, Paul Rubin <http://phr...@NOSPAM.invalidwrote:
Godzilla <godzillais...@gmail.comwrites:
num = 255
numlist = [num >i & 1 for i in range(8)]
Thanks matimus! I will look into it...

numlist = lookup_table[num]

where lookup_table is a precomputed list of lists.
Ummm ... didn't the OP say he had 32-bit numbers???

Jul 13 '07 #5
On Jul 12, 8:49 pm, John Machin <sjmac...@lexicon.netwrote:
On Jul 13, 10:28 am, Paul Rubin <http://phr...@NOSPAM.invalidwrote:
Godzilla <godzillais...@gmail.comwrites:
num = 255
numlist = [num >i & 1 for i in range(8)]
Thanks matimus! I will look into it...
numlist = lookup_table[num]
where lookup_table is a precomputed list of lists.

Ummm ... didn't the OP say he had 32-bit numbers???
List comprehension would be faster, lookup would be even faster but
would have to generate list or dictionary ahead of time
but this will work on any length int up 2 limit of int does not pad
with zeros on most significant end to word length.
n=input()
l=[]
while(n>0):
l.append(str(n&1)); n=n>>1

I posted this here http://www.uselesspython.com/download.php?script_id=222
a while back.

Jul 13 '07 #6
On Jul 13, 11:13 am, bsneddon <bsned...@yahoo.comwrote:
On Jul 12, 8:49 pm, John Machin <sjmac...@lexicon.netwrote:
On Jul 13, 10:28 am, Paul Rubin <http://phr...@NOSPAM.invalidwrote:
Godzilla <godzillais...@gmail.comwrites:
num = 255
numlist = [num >i & 1 for i in range(8)]
Thanks matimus! I will look into it...
numlist = lookup_table[num]
where lookup_table is a precomputed list of lists.
Ummm ... didn't the OP say he had 32-bit numbers???

List comprehension would be faster, lookup would be even faster but
would have to generate list or dictionary ahead of time
but this will work on any length int up 2 limit of int does not pad
with zeros on most significant end to word length.

n=input()
l=[]
while(n>0):
l.append(str(n&1)); n=n>>1

I posted this herehttp://www.uselesspython.com/download.php?script_id=222
a while back.
Thanks all... I will have a look at it soon.

Regarding to the 32-bit number, the lenght is variable but it is
usually defined at design time...

Jul 13 '07 #7
Godzilla <go***********@gmail.comwrites:
Regarding to the 32-bit number, the lenght is variable but it is
usually defined at design time...
That you're trying to represent it as a list of bits at all is
weird, and probably likely to slow the program down. You do know
that python has arbitrary sized ints, right?
Jul 13 '07 #8
On Jul 12, 5:34 pm, Godzilla <godzillais...@gmail.comwrote:
Hello,

I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:

num = 255
numList = [1,1,1,1,1,1,1,1]

with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?
Standing on the shoulders of previous posters, I put this together.

-- Paul
# init list of tuples by byte
bytebits = lambda num : [num >i & 1 for i in range(8)]
bytes = [ tuple(bytebits(i)) for i in range(256) ]

# use bytes lookup to get bits in a 32-bit integer
bits = lambda num : sum((bytes[num >i & 255] for i in range(0,32,8)),
())

# use base-2 log to find how many bits in an integer of arbitrary
length
from math import log,ceil
log_of_2 = log(2)
numBits = lambda num : int(ceil(log(num)/log_of_2))

# expand bits to integers of arbitrary length
arbBits = lambda num : sum((bytes[num >i & 255] for i in
range(0,numBits(num),8)),())

print arbBits((1<<34)-1)
print arbBits(37)

# prints
#(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
#(1, 0, 1, 0, 0, 1, 0, 0)

Jul 13 '07 #9
On Jul 13, 5:17 am, Paul McGuire <pt...@austin.rr.comwrote:
On Jul 12, 5:34 pm, Godzilla <godzillais...@gmail.comwrote:
Hello,
I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:
num = 255
numList = [1,1,1,1,1,1,1,1]
with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?

Standing on the shoulders of previous posters, I put this together.

-- Paul
But aren't we moving backwards? The OP did ask for the fastest way.

I put this together (from other posters and my own):

import gmpy
import time

y = 2**177149 - 1

# init list of tuples by byte
bytebits = lambda num : [num >i & 1 for i in range(8)]
bytes = [ tuple(bytebits(i)) for i in range(256) ]
# use bytes lookup to get bits in a 32-bit integer
bits = lambda num : sum((bytes[num >i & 255] for i in range(0,32,8)),
())
# use base-2 log to find how many bits in an integer of arbitrary
length
from math import log,ceil
log_of_2 = log(2)
numBits = lambda num : int(ceil(log(num)/log_of_2))
# expand bits to integers of arbitrary length
arbBits = lambda num : sum((bytes[num >i & 255] for i in
range(0,numBits(num),8)),())
t0 = time.time()
L = arbBits(y)
t1 = time.time()
print 'Paul McGuire algorithm:',t1-t0

t0 = time.time()
L = [y >i & 1 for i in range(177149)]
t1 = time.time()
print ' Matimus algorithm:',t1-t0

x = gmpy.mpz(2**177149 - 1)
t0 = time.time()
L = [gmpy.getbit(x,i) for i in range(177149)]
t1 = time.time()
print ' Mensanator algorithm:',t1-t0

## Paul McGuire algorithm: 17.4839999676
## Matimus algorithm: 3.28100013733
## Mensanator algorithm: 0.125

Jul 13 '07 #10
On Jul 13, 3:46 pm, "mensana...@aol.com" <mensana...@aol.comwrote:
On Jul 13, 5:17 am, Paul McGuire <pt...@austin.rr.comwrote:


On Jul 12, 5:34 pm, Godzilla <godzillais...@gmail.comwrote:
Hello,
I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:
num = 255
numList = [1,1,1,1,1,1,1,1]
with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?
Standing on the shoulders of previous posters, I put this together.
-- Paul

But aren't we moving backwards? The OP did ask for the fastest way.

I put this together (from other posters and my own):

import gmpy
import time

y = 2**177149 - 1

# init list of tuples by byte
bytebits = lambda num : [num >i & 1 for i in range(8)]
bytes = [ tuple(bytebits(i)) for i in range(256) ]
# use bytes lookup to get bits in a 32-bit integer
bits = lambda num : sum((bytes[num >i & 255] for i in range(0,32,8)),
())
# use base-2 log to find how many bits in an integer of arbitrary
length
from math import log,ceil
log_of_2 = log(2)
numBits = lambda num : int(ceil(log(num)/log_of_2))
# expand bits to integers of arbitrary length
arbBits = lambda num : sum((bytes[num >i & 255] for i in
range(0,numBits(num),8)),())
t0 = time.time()
L = arbBits(y)
t1 = time.time()
print 'Paul McGuire algorithm:',t1-t0

t0 = time.time()
L = [y >i & 1 for i in range(177149)]
t1 = time.time()
print ' Matimus algorithm:',t1-t0

x = gmpy.mpz(2**177149 - 1)
t0 = time.time()
L = [gmpy.getbit(x,i) for i in range(177149)]
t1 = time.time()
print ' Mensanator algorithm:',t1-t0

## Paul McGuire algorithm: 17.4839999676
## Matimus algorithm: 3.28100013733
## Mensanator algorithm: 0.125- Hide quoted text -

- Show quoted text -
Oof! Pre-calculating those byte bitmasks doesn't help at all! It
would seem it is faster to use a single list comp than to try to sum
together the precalcuated sublists.

I *would* say though that it is somewhat cheating to call the other
two algorithms with the hardcoded range length of 177149, when you
know this is the right range because this is tailored to fit the input
value 2**177149-1. This would be a horrible value to use if the input
number were something small, like 5. I think numBits still helps here
to handle integers of arbitrary length (and only adds a slight
performance penalty since it is called only once).

-- Paul

Jul 14 '07 #11
On Jul 14, 5:49?pm, Paul McGuire <pt...@austin.rr.comwrote:
On Jul 13, 3:46 pm, "mensana...@aol.com" <mensana...@aol.comwrote:


On Jul 13, 5:17 am, Paul McGuire <pt...@austin.rr.comwrote:
On Jul 12, 5:34 pm, Godzilla <godzillais...@gmail.comwrote:
Hello,
I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:
num = 255
numList = [1,1,1,1,1,1,1,1]
with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?
Standing on the shoulders of previous posters, I put this together.
-- Paul
But aren't we moving backwards? The OP did ask for the fastest way.
I put this together (from other posters and my own):
import gmpy
import time
y = 2**177149 - 1
# init list of tuples by byte
bytebits = lambda num : [num >i & 1 for i in range(8)]
bytes = [ tuple(bytebits(i)) for i in range(256) ]
# use bytes lookup to get bits in a 32-bit integer
bits = lambda num : sum((bytes[num >i & 255] for i in range(0,32,8)),
())
# use base-2 log to find how many bits in an integer of arbitrary
length
from math import log,ceil
log_of_2 = log(2)
numBits = lambda num : int(ceil(log(num)/log_of_2))
# expand bits to integers of arbitrary length
arbBits = lambda num : sum((bytes[num >i & 255] for i in
range(0,numBits(num),8)),())
t0 = time.time()
L = arbBits(y)
t1 = time.time()
print 'Paul McGuire algorithm:',t1-t0
t0 = time.time()
L = [y >i & 1 for i in range(177149)]
t1 = time.time()
print ' Matimus algorithm:',t1-t0
x = gmpy.mpz(2**177149 - 1)
t0 = time.time()
L = [gmpy.getbit(x,i) for i in range(177149)]
t1 = time.time()
print ' Mensanator algorithm:',t1-t0
## Paul McGuire algorithm: 17.4839999676
## Matimus algorithm: 3.28100013733
## Mensanator algorithm: 0.125

Oof! Pre-calculating those byte bitmasks doesn't help at all! It
would seem it is faster to use a single list comp than to try to sum
together the precalcuated sublists.

I *would* say though that it is somewhat cheating to call the other
two algorithms with the hardcoded range length of 177149, when you
know this is the right range because this is tailored to fit the input
value 2**177149-1. This would be a horrible value to use if the input
number were something small, like 5. I think numBits still helps here
to handle integers of arbitrary length (and only adds a slight
performance penalty since it is called only once).
I agree. But I didn't want to compare your numBits
against gmpy's numdigits() which I would normally use.
But since the one algorithm required a hardcoded number,
I thought it best to hardcode all three.

I originally coded this stupidly by converting
the number to a string and then converting to
a list of integers. But Matimus had already posted
his which looked a lot better than mine, so I didn't.

But then I got to wondering if Matimus' solution
requires (B**2+B)/2 shift operations for B bits.

My attempt to re-code his solution to only use B
shifts didn't work out and by then you had posted
yours. So I did the 3-way comparison using gmpy's
direct bit comparison. I was actually surprised at
the difference.

I find gmpy's suite of bit manipulation routines
extremely valuable and use them all the time.
That's another reason for my post, to promote gmpy.

It is also extremely important to keep coercion
out of loops. In other words, never use literals,
only pre-coerced constants. For example:

import gmpy
def collatz(n):
ONE = gmpy.mpz(1)
TWO = gmpy.mpz(2)
TWE = gmpy.mpz(3)
while n != ONE:
if n % TWO == ONE:
n = TWE*n + ONE
else:
n = n/TWO
collatz(gmpy.mpz(2**177149-1))
>
-- Paul
Jul 15 '07 #12
On 7 13 , 6 34 , Godzilla <godzillais...@gmail.comwrote:
Hello,

I'm trying to find a way to convert an integer (8-bits long for
starters) and converting them to a list, e.g.:

num = 255
numList = [1,1,1,1,1,1,1,1]

with the first element of the list being the least significant, so
that i can keep appending to that list without having to worry about
the size of the integer. I need to do this because some of the
function call can return a 2 lots of 32-bit numbers. I have to find a
way to transport this in a list... or is there a better way?
my clone *bin* function from python3000
def _bin(n, count=32):
"""returns the binary of integer n, using count number of digits"""
return ''.join([str((n >i) & 1) for i in range(count-1, -1, -1)])

Jul 15 '07 #13

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

17
by: DraguVaso | last post by:
Hi, I need to find the FASTEST way to get a string in a Loop, that goes from "a" to "ZZZZZZZZZZZZZZZZZ". So it has to go like this: a b .... z
6
by: Jonathan | last post by:
I am hoping that someone more experienced than myself can point me towards what might be the fastest data lookup method to use for storing ip addresses. My situation is that I will need to maintain...
5
by: Daniel | last post by:
in C# fastest way to convert a string into a MemoryStream
9
by: Charles Law | last post by:
Suppose I have a structure Private Structure MyStruct Dim el1 As Byte Dim el2 As Int16 Dim el3 As Byte End Structure I want to convert this into a byte array where
14
by: Charles Law | last post by:
I thought this had come up before, but I now cannot find it. I have a byte array, such as Dim a() As Byte = {1, 2, 3, 4} I want to convert this to an Int32 = 01020304 (hex). If I use...
6
by: moondaddy | last post by:
I'm writing an app in vb.net 1.1 and need to convert a byte array into a string, and then from a string back to a byte array. for example Private mByte() as New Byte(4){11,22,33,44} Now how...
5
by: Bob Homes | last post by:
In VB6, foreground and background colors of controls had to be assigned a single number. If you knew the RGB values for the color, you still had to convert them into the single number accepatable...
24
by: ThunderMusic | last post by:
Hi, The subject says it all... I want to use a byte and use it as byte* so I can increment the pointer to iterate through it. What is the fastest way of doing so in C#? Thanks ThunderMusic
0
by: laviewpbt | last post by:
Fist ,Add a new class named "CImage",then copythe following codes and paste to it. Option Explicit Private Type BITMAPFILEHEADER bfType As Integer bfSize As Long ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.