【问题标题】:Determine programming logic确定编程逻辑
【发布时间】:2013-10-28 23:52:10
【问题描述】:

我收到一个与 8 个继电器值打开或关闭相关的十进制变量。 if off 其值为 0 if on it 变量如下

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 和说 relay5 之间的相关性。

大多数人都熟悉python,所以要在那里对它进行分类。

【问题讨论】:

    标签: python logic


    【解决方案1】:

    我会使用 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
    

    当您使用&amp;,Python 的 bit-wise and-operator 时,它会将数字的每一位单独与在一起。 2 的幂,1、2、4、8 等等,在它们的二进制表示中只设置了一个位,所以当你 &amp; 他们使用有问题的值时,如果这些位对齐,它们返回一个非零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 &gt;&gt; relay 获得 2 的幂。

    【讨论】:

      【解决方案2】:

      使用bin(n)将输入转换为二进制,结果位将对应继电器的状态:0表示关闭,1表示开启。

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

      最右边(最低有效)位对应于继电器 1(显示它处于开启状态),最左边(最高有效)位对应于继电器 8(当前开启)。

      【讨论】:

        【解决方案3】:

        关键是将整数转换为二进制,最简单的方法是使用内置的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(这是一个令人困惑的想法)或者使用它来确定继电器的状态并在此基础上改变逻辑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多