根据位域创建字符串

时间:2019-03-16 14:47:14

标签: python bit-fields

我正在使用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字符串?

1 个答案:

答案 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