我使用5位位域来跟踪python脚本中的报警系统的状态。例如,MSB中的0表示“Not Armed”,而MSB中的1表示“Armed”等。这使得先前状态和当前状态的XOR能够快速产生哪些位已经改变:
previous = 0b11001
current = 0b10011
delta = current ^ previous # delta = 0b01010
我的代码的下一步是根据delta
生成一个描述更改内容的字符串。有10种可能的描述状态。我想知道创建这个字符串的最佳方法。我的下面有什么作品,但看起来很笨重:
statusKey = {
0: ' * Disarmed',
10: ' * No Alarm',
20: ' * No Fire',
30: ' * No Check',
40: ' * No AC',
1: ' * Armed',
11: ' * Alarm',
21: ' * Fire',
31: ' * Check',
41: ' * AC'
}
alert = ''
for i in range (5):
if (0b10000 & (delta << i)):
alert = ''.join((alert,statusKey[(10*i) + (0b01 & (current >> (4-i)))]))
#alert = 'No Alarm * Check'
有没有更好的方法来构建statusKey
中的数据?有没有更好的方法来生成基于该结构的alert
字符串?
尝试使用尽可能少的按位数学运算符,因为它使您的代码非常难以理解。您真正需要的只是一个简单的列表理解。此外,您希望您的位状态数据结构具有自我描述性。有人第一次阅读它应该立即理解逻辑。
bit_status = {
0: ("Disarmed", "Armed"),
1: ("No Alarm", "Alarm"),
2: ("No Fire", "Fire"),
3: ("No Check", "Check"),
4: ("No AC", "AC")
}
previous = 0b11001
current = 0b10011
current_bits = [current >> i & 1 for i in reversed(range(5))]
delta_bits = [(current ^ previous) >> i & 1 for i in reversed(range(5))]
status = [bit_status[index][current_bits[index]]
for index, delta_bit in enumerate(delta_bits) if delta_bit == 1]
print(" * ".join(status))
# No Alarm * Check