bitmap

BitMap 的一种实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

# -*- coding: utf-8 -*-

class CustomBitsetType(object):
INT_BITS = 64 - 1

def __init__(self):
self.data = {} # {index: int64}

def get_bit(self, index):
key, bit_pos = divmod(index, CustomBitsetType.INT_BITS)
if key not in self.data:
return False
return bool(self.data[key] & 1<<bit_pos)

def set_bit(self, index, bit_value):
key, bit_pos = divmod(index, CustomBitsetType.INT_BITS)
if key not in self.data:
if bit_value:
self.data[key] = 1 << bit_pos
return

if bit_value:
self.data[key] = self.data[key] | 1<<bit_pos
return

value = self.data[key] & ~(1 << bit_pos)
if value > 0:
self.data[key] = value
else:
self.data.pop(key)


# region -------------------- 数据数据被同步到 --------------------
def on_setattr(self, key, old, new):
old = old or 0
new = new or 0
for i in range(CustomBitsetType.INT_BITS):
in_old = old & 1 << i > 0
in_new = new & 1 << i > 0
if in_old != in_new:
self.on_set_bit(key * CustomBitsetType.INT_BITS + i, in_old, in_new)

def on_set_bit(self, index, old, new):
self.set_bit(index, new)
# endregion -------------------- 数据数据被同步到 --------------------


bitset = CustomBitsetType()
remote_bitset = CustomBitsetType()

print("[local]", bitset.get_bit(12))
print("[local]", bitset.set_bit(12, True))
print("[local]", bitset.get_bit(12))
print("=========================")
# NOTE: mock 数据同步到远端
for k, v in bitset.data.items():
remote_bitset.on_setattr(k, 0, v)
print("[remote]", remote_bitset.get_bit(11))
print("[remote]", remote_bitset.get_bit(12))

print(bitset.data, remote_bitset.data)
  • 运行结果
1
2
3
4
5
6
7
8
> & C:/Python39/python.exe test.py
[local] False
[local] None
[local] True
=========================
[remote] False
[remote] True
{0: 4096} {0: 4096}