暮らしの技術

暮らしを豊かにする技術や、特に暮らしを豊かにしない技術があります

pythonでm個のbitがたっている数値をn以下で調べる

なんかビット表現に変えて文字列にしてsplitするみたいな荒技でもいいんだけど,ちゃんとしたらこういう感じかな.対象とする数値を表現するのに何桁いるか調べて,そのうえで各桁のマスクを格納したリストを作る.マスクリストの各要素と対象とする数値のAND演算をして0意外が帰ってきた回数を調べる.

import sys
import math

def createMasks(n):
    maskList = []
    for x in range(n):
        maskList.append(int(math.pow(2, x)))

    return maskList

def hasNFlags(flags, n):
    result = 0
    maskList = []
    if n != 0:
        bitLength = int(math.log(n, 2)) + 1
        maskList = createMasks(bitLength)

    for mask in maskList:
        if (n & mask):
            result += 1

    if result == flags:
        return True

    return False


if __name__ == "__main__":
    print "USAGE: python bitmask.py <flags> <limit>"
    flags = int(sys.argv[1])
    limit = int(sys.argv[2])
    for x in range(limit):
        if (hasNFlags(flags, x)):
            print x
            print bin(x)

# 8以下で2つのフラグが立ってる数値
# $ python bitmask.py 2 8
# USAGE: python bitmask.py <flags> <limit>
# 3
# 0b11
# 5
# 0b101
# 6
# 0b110

# 8以下で3つのフラグが立ってる数値
# $ python bitmask.py 3 8
# USAGE: python bitmask.py <flags> <limit>
# 7
# 0b111