なんかビット表現に変えて文字列にして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