整数とビット列の相互変換

Python って関数型言語ですよね。
ちなみに、変換数値の上限がない代わりに負数非対応。というか Python は自動的に数値の範囲を拡張するからちゃんとやろうとするとかなり面倒そう。

import sys

def byte2bits(i):
    """
    convert byte as bit list.

    >>> byte2bits(10)
    [0, 0, 0, 0, 1, 0, 1, 0]
    """
    return [(i >> j) & 0x01 for j in reversed(range(8))]

_BYTE_TO_BITS = [byte2bits(i) for i in xrange(0x100)]

def int2bits(i):
    """
    convert integer as bit list.

    >>> int2bits(49015)
    [1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]
    """
    def f(x):
        while x > 0:
            yield _BYTE_TO_BITS[x & 0xff]
            x >>= 8
    return sum(reversed(list(f(i))), [])
    
def bits2int(bits):
    """
    convert bit list as integer

    >>> bits2int([0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0])
    29556
    """
    return reduce(lambda r, x: r << 1 | x, bits, 0)

def _test():
    import doctest
    doctest.testmod()

if __name__ == '__main__':
    _test()