我正在使用5位位域在python脚本中跟踪警报系统的状态。例如,MSB中的0表示“未设防”,而MSB中的1表示“已设防”,依此类推。这使对先前状态和当前状态的XOR可以快速产生已更改的位:
date txVolume(USD) adjustedTxVolume(USD) txCount marketcap(USD) price(USD) exchangeVolume(USD) generatedCoins fees activeAddresses averageDifficulty paymentCount medianTxValue(USD) medianFee blockSize blockCount
04/05/2018 7837824038 4235399151 218931 1.65E+11 9695.5 8217829888 1725 39.37853649 695603 4.02E+12 395233 395.3934459 4.04E-05 134387026 138
我的代码的下一步是根据previous = 0b11001
current = 0b10011
delta = current ^ previous # delta = 0b01010
生成一个描述更改内容的字符串。有10种可能的状态及其说明。我想知道创建此字符串的最佳方法。我下面的东西有用,但是笨拙:
delta
是否有更好的方法来组织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
字符串?
答案 0 :(得分:1)
请尝试使用尽可能少的按位数学运算符,因为这会使您的代码非常不可读。您真正需要的只是一个简单的列表理解功能。另外,您希望您的位状态数据结构是自我描述。第一次阅读它的人应该立即理解其逻辑。
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