2011/03/11

Считаем количество ненулевых битов

"Предложите способ посчитать количество ненулевых битов в содержимом файла с именем blob.dat". Предлагаю:

#!/usr/bin/python2.7

def bstr(n):
    return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)])

f = file('blob.dat', 'rb')
bytes = f.read()
sheet = ''.join([bstr(ord(c)) for c in bytes])

amount = 0
for bit in sheet:
    if bit == '1': amount += 1

print amount

3 comments:

  1. Ваш блог мне очень понравился так как качественный. Очень легко даётся информация. Я как новичок это ценю.

    Вы можете увидеть на моём блоге ссылку на этот.
    см.Изучаем Python / Полезные блоги и сайты

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Ежели заморочиться и попытаться оптимизировать по скорости, то можно замутить функцию подсчета единичных битов в байте табличным методом или по алгоритму Кернигана.

    Кроме того, существует аппаратная реализация - инструкция popcnt. В интелах она появилась вроде как с core i7 и входит в набор инструкций sse4.2

    Матчасть по извращениям:

    http://gurmeet.net/puzzles/fast-bit-counting-routines/

    http://wiki.python.org/moin/BitManipulation#CA-8a4270f706bae502366d3d0db78ac93aad6ac04a_2
    http://www.strchr.com/crc32_popcnt

    http://wm.ite.pl/articles/sse-popcount.html

    ReplyDelete