[EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > It seems like this would be easy but I'm drawing a blank. > > What I want to do is be able to open any file in binary mode, and read > in one byte (8 bits) at a time and then count the number of 1 bits in > that byte. > > I got as far as this but it is giving me strings and I'm not sure how > to accurately get to the byte/bit level. > > f1=file('somefile','rb') > while 1: > abyte=f1.read(1)
You should probaby prepare before the loop a mapping from char to number of 1 bits in that char: m = {} for c in range(256): m[c] = countones(c) and then sum up the values of m[abyte] into a running total (break from the loop when 'not abyte', i.e. you're reading 0 bytes even though asking for 1 -- that tells you the fine is finished, remember to close it). A trivial way to do the countones function: def countones(x): assert x>=0 c = 0 while x: c += (x&1) x >>= 1 return c you just don't want to call it too often, whence the previous advice to call it just 256 times to prep a mapping. If you download and install gmpy you can use gmpy.popcount as a fast implementation of countones:-). Alex -- http://mail.python.org/mailman/listinfo/python-list