所以我对并行端口很陌生,我一直在这里研究这段代码 ->> 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 位,依此类推。最后,它们全部与 | 一起或运算。构建一个位反转的单个字节。
