2012-07-10 78 views
1

所以我和並行端口相當新的,我已經在這裏學習,這個代碼 - >>http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyparallel/examples/lcd.py?revision=49&view=markuppyParallel蟒蛇交換針

,我很困惑,到底是怎麼回事這裏

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) 

我知道這是反轉引腳,但我不明白語法本身以及它的字面意思。
任何幫助將不勝感激謝謝!

回答

6

讓我們一塊一塊地考慮:1<<n是一個向左移1位的位置,所以這些值給了我們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取零或1,並將它移到左邊的m個位置,所以它基本上覆制第n位並將其放在第m位。八條線分別用0和7表示n和m,然後是1和6,然後是2和5等,所以我們得到8個值。首先是第七位的第0位,然後是第6位的第1位,依此類推。最後,它們全部或者與|一起構建一個單個字節,其位反轉。