2011-10-18 17 views
1

は、私はPythonで、次のコードを持っている:私は座標で働いている"1 << i"のシフトはどのようにPythonで動作しますか?

for i in range(4): 
    if self.start == self.corners[i]: 
    self.visitedCorners += (1 << i) 

self.startおよびself.cornersは座標である。

トップのコードでは、スタートがコーナーかどうかをチェックしたいと思います。 スタートがコーナーと同じ場合、私はそのシフトを行います。しかし、それはどのように変化するのでしょうか?

他のコードは必要ありません。私はちょうどこのコードを理解したいと思います。

+0

https://secure.wikimedia.org/wikipedia/en/wiki/Logical_shift –

+0

これは2の累乗(2のi + 1の累乗)に相当します。バイナリへようこそ。ソフトウェア開発にはバイナリなものがたくさんあります。 1,2,4,8,16,32 ... –

+0

*シフト "1 << i"はPythonでどのように動作するのですか?*:他の言語と同じです....(申し訳ありませんが、抵抗できませんでした。 ))。 –

答えて

4

すべてその1 << iはないが1に設定i番目の最下位ビット及び0に設定されたすべての他のビットとの数を生成である:、

コードで
>>> for i in range(4): print bin(1 << i) 
... 
0b1 
0b10 
0b100 
0b1000 

self.visitedCornersはビットマスクであり、ここで4つの最下位ビットは4つのコーナーに対応する。 for iループの各繰り返しは、self.visitedCornersの対応するビットを1に設定します(ただし、条件が成立する場合はifになります)。

+0

+1。コンテキストがなければ、最後の行は正しく動作するビットマスクを保証するために 'self.visitedCorners | =(1 << i)'でなければなりません。 – back2dos

+0

「1 << i」は「2 ** i」と同じです。一般に、 'x << i'は' x *(2 ** i) 'と同じです。シフト演算子はちょうど効率的です(ビット単位でネガを扱うために特別なケースがあります) –

関連する問題