我收到一个十进制变量,它与8个继电器值的开启或关闭相关。如果关闭它的值为0,如果在它上面,变量如下
Relay1 = 1
Relay2 = 2
Relay3 = 4
Relay4 = 8
Relay5 = 16
Relay6 = 32
Relay7 = 64
Relay8 = 128
因此,如果Relay1和Relay8开启,我会收到129.
Relay1 = 1
Relay2 = 0
Relay3 = 0
Relay4 = 0
Relay5 = 0
Relay6 = 0
Relay7 = 0
Relay8 = 128
我需要创建一些逻辑来弄清楚当我收到0-255之间的值时,继电器值是什么。最后,我只是吐出一些XML代码,这些代码将具有以下内容
<map key="00">
<update state="Relay1" type="boolean">Off</update>
<update state="Relay2" type="boolean">Off</update>
<update state="Relay3" type="boolean">Off</update>
<update state="Relay4" type="boolean">Off</update>
<update state="Relay5" type="boolean">Off</update>
<update state="Relay6" type="boolean">Off</update>
<update state="Relay7" type="boolean">Off</update>
<update state="Relay8" type="boolean">Off</update>
</map>
<map key="01">
<update state="Relay1" type="boolean">On</update>
<update state="Relay2" type="boolean">Off</update>
<update state="Relay3" type="boolean">Off</update>
<update state="Relay4" type="boolean">Off</update>
<update state="Relay5" type="boolean">Off</update>
<update state="Relay6" type="boolean">Off</update>
<update state="Relay7" type="boolean">Off</update>
<update state="Relay8" type="boolean">Off</update>
</map>
<map key="02">
<update state="Relay1" type="boolean">Off</update>
<update state="Relay2" type="boolean">On</update>
<update state="Relay3" type="boolean">Off</update>
<update state="Relay4" type="boolean">Off</update>
<update state="Relay5" type="boolean">Off</update>)
<update state="Relay6" type="boolean">Off</update>
<update state="Relay7" type="boolean">Off</update>
<update state="Relay8" type="boolean">Off</update>
</map>
<map key="129">
<update state="Relay1" type="boolean">On</update>
<update state="Relay2" type="boolean">Off</update>
<update state="Relay3" type="boolean">Off</update>
<update state="Relay4" type="boolean">Off</update>
<update state="Relay5" type="boolean">Off</update>
<update state="Relay6" type="boolean">Off</update>
<update state="Relay7" type="boolean">Off</update>
<update state="Relay8" type="boolean">On</update>
</map>
所以编程语言并不那么重要,但对逻辑的帮助会很大。我不想写出所有255个场景,因为这个xml被简化了。如果有人能指出我正确的方向,那将是伟大的。我正在努力的是129和说继电器5之间的相关性。
对python最熟悉,所以要在那里进行分类。
答案 0 :(得分:3)
我使用bit-wise shifting(或2的幂)和bit-wise comparisons来获取给定输入的中继值。我认为有点清洁,而不是将其转换为bin
value = 53
for relay in range(8):
print 'Relay{} = {}'.format(relay + 1, 2**relay & value)
打印:
Relay1 = 1
Relay2 = 0
Relay3 = 4
Relay4 = 0
Relay5 = 16
Relay6 = 32
Relay7 = 0
Relay8 = 0
当您使用&
,Python的按位和 - 运算符时,它会单独和将数字的每一位组合在一起。两个,1个,2个,4个,8个等的幂只在它们的二进制表示中设置了一个位,所以当你&
使用有问题的值时,如果这些位对齐,它们将返回非-zero number(True),如果不是,则为0(False)。
53 = 00110101
--------------
1 = 00000001 --&-> 00000001 # the 1's place lined up, so you get it back
2 = 00000010 --&-> 00000000 # nothing at the 2's in the key
4 = 00000100 --&-> 00000100 # 4's place lines up
... and so on.
对于所有事情:
for key in range(256):
print '<map key="{}">'.format(key)
for relay in range(8):
print ' <update state="Relay{}" type="boolean">{}</update>'.format(
relay + 1, 'On' if key & 2**relay else 'Off')
print '</map>'
关于转移,如果你是C程序员,你也可以使用1 >> relay
获得2的幂。
答案 1 :(得分:1)
使用bin(n)
将输入转换为二进制,结果位将对应于继电器的状态:0表示关闭,1表示打开。
>>> bin(129)
'0b10000001'
>>>
最右边(最低有效)位对应继电器1(显示为开),最左边(最高有效)位对应继电器8(当前为开)。
答案 2 :(得分:1)
关键是将整数转换为二进制,最简单的方法是使用内置的bin()
。
从那里,迭代二进制数中的每个位,然后将其转换为索引的数量。由于二进制数是最重要的位,因此您需要以相反的顺序(x[::-1]
)
>>> for i,x in enumerate(bin(8)[:1:-1]):
... print "Relay ",i+1," is ",['off','on'][int(x)]
...
Relay 1 is off
Relay 2 is off
Relay 3 is off
Relay 4 is on
您可以将此打包为以下函数:
# Returns an array, with 'True' if the relay is 'on', false otherwise.
def relays(in):
return [i=='1' for i in enumerate(bin(in)[:1:-1]]
然后调用255次来生成XML(这是一个令人困惑的想法)或使用它来确定继电器的状态并根据它改变逻辑。