首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定编程逻辑

确定编程逻辑
EN

Stack Overflow用户
提问于 2013-10-28 23:52:10
回答 3查看 144关注 0票数 0

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

代码语言:javascript
复制
Relay1 = 1
Relay2 = 2
Relay3 = 4
Relay4 = 8
Relay5 = 16
Relay6 = 32
Relay7 = 64
Relay8 = 128

所以如果Relay1和Relay8开着的话,我会收到129个。

代码语言:javascript
复制
Relay1 = 1
Relay2 = 0
Relay3 = 0
Relay4 = 0
Relay5 = 0
Relay6 = 0
Relay7 = 0
Relay8 = 128

我需要创建一些逻辑,以确定当我收到介于0-255之间的值时,中继值将是什么。最终,我只是吐露出一些XML代码,这些代码将包含如下内容

代码语言:javascript
复制
<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之间的关联。

最熟悉蟒蛇,所以要把它放在那里。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-28 23:58:18

我会使用位向移位 (或2的幂)和按位比较从给定的输入中获得中继值。在我看来,要比用bin将它转换成字符串要更干净一些

代码语言:javascript
复制
value = 53
for relay in range(8):
    print 'Relay{} = {}'.format(relay + 1, 2**relay & value)

指纹:

代码语言:javascript
复制
Relay1 = 1
Relay2 = 0
Relay3 = 4
Relay4 = 0
Relay5 = 16
Relay6 = 32
Relay7 = 0
Relay8 = 0

当您使用& (Python的位级和运算符)时,它是单独的,并将数字中的每一个位放在一起。2、1、2、4、8等的幂数在其二进制表示中只有一个位集,所以当您用所述值对齐时,如果位对齐,则返回一个非零数(True),如果不是,则返回0 (False)。

代码语言:javascript
复制
 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.

为了所有的事情:

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2013-10-28 23:54:54

使用bin(n)将输入转换为二进制,结果位将对应于中继的状态:0表示off,1表示on。

代码语言:javascript
复制
>>> bin(129)
'0b10000001'
>>> 

最右边(最不重要)位对应于中继1(显示它是打开的),而最左边(最重要)位对应于中继8(当前打开)。

票数 1
EN

Stack Overflow用户

发布于 2013-10-28 23:57:27

关键是将整数转换为二进制,最简单的方法是使用内置的bin()

从那里开始,对二进制数中的每个位进行迭代,然后将其转换为索引的数量。由于二进制数首先是最重要的位,所以需要按反向顺序(x[::-1])迭代。

代码语言:javascript
复制
>>> 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

您可以将它打包成这样的函数:

代码语言:javascript
复制
# 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 (这是一个令人困惑的想法),要么使用它来确定中继的状态,并在此基础上更改逻辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19647248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档