2012-07-10 4 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 시프트 된 n 자리이므로 이러한 값은 0x01, 0x02, 0x04, 0x08, 0x10 등의 바이트를 나타냅니다. x & (1<<n)은 해당 비트로 마스크 된 x이므로 x의 개별 비트를 얻습니다. x & (1<<n) and 1은 까다 롭습니다. 비트가 x에 설정되면 두 번째 인수로 평가되며 1이됩니다. 비트가 x에 설정되지 않으면 0이됩니다. 따라서 x & (1<<n) and 1은 비트가 x에 설정되면 1, 그렇지 않으면 0입니다.

(x & (1<<n) and 1) << m은 0 또는 1을 취하여 왼쪽 m 자리로 이동하므로 본질적으로 n 번째 비트를 복사하여 m 번째 비트에 넣습니다. 8 개의 라인은 n과 m에 대해 0과 7을 사용하고, 1과 6, 그리고 2와 5 등을 사용하므로 8 개의 값을 얻습니다. 첫 번째는 7 위의 0 번째 비트, 6 위의 1 번째 비트 등입니다. 마지막으로 비트들은 모두 반전 된 단일 바이트를 만들기 위해 모두 |과 함께 or'ed됩니다.