确定编程逻辑

2024-10-03 23:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在接收一个十进制变量,它与8个继电器的on或off值相关。如果关闭,则其值为0,如果打开,则变量如下

Relay1 = 1
Relay2 = 2
Relay3 = 4
Relay4 = 8
Relay5 = 16
Relay6 = 32
Relay7 = 64
Relay8 = 128

所以如果1号和8号继电器打开,我会收到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和say relay5之间的相关性。你知道吗

最熟悉python,所以我们要在那里分类。你知道吗


Tags: keymaptypeupdatestatebooleanoffrelay4
3条回答

我将使用bit-wise shifting(或2的幂)和bit-wise comparisons从给定的输入获取中继值。在我看来,这比用^{}将其转换为字符串要干净一些

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的逐位的and操作符时,它将数字的每一位单独地和在一起。2、1、2、4、8等的幂在二进制表示中只设置了一个位,因此当您&将它们与所讨论的值对齐时,如果这些位对齐,它们将返回一个非零的数字(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的幂。你知道吗

关键是将整数转换成二进制,最简单的方法是使用内置的^{}。你知道吗

从那里,迭代二进制数中的每一位,然后将其转换为索引的数字。由于二进制数首先是最重要的位,所以需要按相反的顺序迭代(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(这是一个令人困惑的想法),要么使用它来确定中继的状态并在此基础上改变逻辑。你知道吗

使用bin(n)将输入转换为二进制,得到的位将对应于继电器的状态:0表示关,1表示开。你知道吗

>>> bin(129)
'0b10000001'
>>> 

最右边的(最低有效)位对应于继电器1(显示其打开),最左边的(最高有效)位对应于继电器8(当前打开)。你知道吗

相关问题 更多 >