如何理解在bitarray

时间:2015-05-15 15:23:16

标签: python bit flags

我用Python连接到PLC。该PLC以8位表示形式提供报警条件。例如:

0110 0010
  • 位0 =开灯/关灯
  • 位1 =风扇打开/关闭
  • bit 2 =闹钟开/关
  • 第3位=门开/关
  • ...

每一位都说明不同的情况。

我想创建一个条件列表并将它们打印在一起,例如:门打开,闹钟关闭,灯灭,等等。

在上面的例子中,有三种不同的条件。我想一起展示它们,所有这些都可以是10。如何将故障/条件与位相关联?

2 个答案:

答案 0 :(得分:3)

对于这些类型的任务,我喜欢设置一个字典,其中的位映射到漂亮的文本表示。因为Python支持二进制文字,所以它非常好地自我记录......

类似的东西:

status_lookup = { 0b00000001 : "Lights",
                  0b00000010 : "Fan",
                  0b00000100 : "Alarm",
                  0b00001000 : "Door"}

然后,如果您想要一个当前“开启”状态的列表:

bits = 0x0a # or whatever your input value was
currently_on = [status_lookup[i] for i in status_lookup if i & bits]

如果你想用字符串将它们连接在一起:

print("; ".join(currently_on))

作为替代方案,如果你使用Python 3.4+,你可以使用新的枚举模块做类似的事情:

from enum import IntEnum

class Status(IntEnum):
    Lights = 0b00000001
    Fan = 0b00000010
    Alarm = 0b00000100
    Door = 0b00001000

bits = 0x0a
currently_on = [x for x in Status if x & bits]

答案 1 :(得分:0)

有更优雅的方式,但这将让你前进:

s = ''
if value & 1:
    s += "lights on"
else:
    s += "lights off"

if value & 2:
    s += ", fan on"
else:
    s += ", fan off"

if value & 4:
    s += ", alarm on"
else:
    s += ", alarm off"

if value & 8:
    s += ", door on"  #?  "door open"?
else:
    s += ", door off"