123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- from functools import reduce
- import math
- class Bitmap(int):
- def __new__(cls, value=0, *args, **kwargs):
- return super(cls, cls).__new__(cls, value)
- # iterable: positions of bits to set.
- @classmethod
- def from_list(cls, iterable):
- v = reduce(lambda x,y: x|2**y, iterable, 0) # iterable
- return super(cls, cls).__new__(cls, v)
- def __repr__(self):
- return "Bitmap("+format(self, 'b')+")"
- def __str__(self):
- return self.__repr__()
- def __or__(self, other):
- return self.__class__(super().__or__(other))
- def __and__(self, other):
- return self.__class__(super().__and__(other))
- def __invert__(self):
- return self.__class__(super().__invert__())
- def set(self, pos):
- return self.__or__(2**pos)
- def unset(self, pos):
- return self.__and__(~2**pos)
- def has(self, pos):
- return self & 2**pos
- def has_all(self, bitmap):
- return (self | bitmap) == self
- # pos of first set bit
- def first_bit_pos(self):
- return math.floor(math.log2(x & -x))
- def Bit(pos):
- return Bitmap(2 ** pos)
|