Skip to main content
 首页 » 编程设计

python之pyParallel python交换引脚

2025年05月04日16小虾米

所以我对并行端口很陌生,我一直在这里研究这段代码 ->> http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyparallel/examples/lcd.py?revision=49&view=markup

我对这里发生的事情感到困惑

def reveseout(self, x): 
    r = ((x & (1<<0) and 1) << 7) |\ 
        ((x & (1<<1) and 1) << 6) |\ 
        ((x & (1<<2) and 1) << 5) |\ 
        ((x & (1<<3) and 1) << 4) |\ 
        ((x & (1<<4) and 1) << 3) |\ 
        ((x & (1<<5) and 1) << 2) |\ 
        ((x & (1<<6) and 1) << 1) |\ 
        ((x & (1<<7) and 1) << 0) 
    #print "%02x" % r, "%02x" %x 
    self.p.setData(r) 

我理解它是为了反转引脚,但我不理解语法本身以及它的字面意思。
任何帮助将不胜感激 谢谢!

请您参考如下方法:

让我们一 block 一 block 地看:1<<n是一个 1 向左移动 n 位,所以这些值给我们 0x01、0x02、0x04、0x08、0x10 等,一个字节中的位。 x & (1<<n) x 被那个位屏蔽了,所以我们得到了 x 的各个位。 x & (1<<n) and 1是棘手的:如果该位在 x 中设置,那么它将评估为第二个参数,它将是 1。如果该位未在 x 中设置,那么它将为零。所以x & (1<<n) and 1如果该位在 x 中设置,则为 1,否则为 0。

(x & (1<<n) and 1) << m取零或一并将其向左移动 m 位,因此它实际上复制了第 n 位并将其放入第 m 位。这八行对 n 和 m 使用 0 和 7,然后是 1 和 6,然后是 2 和 5,等等,所以我们得到八个值。首先是第 7 位的第 0 位,然后是第 6 位的第 1 位,依此类推。最后,它们全部与 | 一起或运算。构建一个位反转的单个字节。