2013-04-30 56 views
2

我很努力地理解「if(i >> j)%2 == 1」在下面的函數或任何函數中對於這個問題做了什麼?努力理解python中的按位運算符

def powerSet(items): 

    N = len(items) 
    for i in xrange(2**N): 
       combo = [] 
     for j in xrange(N): 
      if (i >> j) % 2 == 1: 
       combo.append(items[j]) 
     yield combo 
+1

更妙的是'如果(我>> J)1' – jamylak 2013-04-30 23:14:48

回答

5

它檢查j「個二進制數i,從端計數位是否被設定。 i >> j右移,所以最後的j位消失了。 n % 2 == 1是對奇數的熟悉檢查,二進制的最後一位被設置。

編輯:這是產生一個功率設置如下。外循環遍歷所有2**N子集items,每個表示爲一個二進制整數。內部循環然後通過檢查這些整數的最後位中的哪一個被設置來構造實際的子集,使用該位作爲子集成員的指示符。

例如,假設N=5。那麼在某些時候,i將是0b10011。由此可以構建集合[items[0], items[1], items[4]]。首先扭轉位,因爲他們編號從右到左的j:(嘗試打印icombo內環內)

1   1   0   0   1 
items[0] items[1] (nothing) (nothing) items[4] 

+0

@PadraicCunningham:看到更新的答案。 – 2013-04-30 21:57:47

+0

謝謝我越來越接近理解:) b在你的二進制0b10011中代表什麼? – 2013-04-30 22:06:54

+0

@PadraicCunningham:它是一個二進制文字的Python符號,就像'0x'開始一個十六進制文字一樣。 – 2013-04-30 22:08:34

1

可以在二進制打印數爲操作進展,看看它是如何工作的。以下是i = 1234和j = 4的示例。

1234以二進制

>>> '{:b}'.format(1234) 
'10011010010' 

右移4位使最右邊的位(0010),以落入遠

>>> '{:b}'.format(1234>>4) 
'1001101' 

模運算除以2並讓您其餘

>>> '{:b}'.format((1234>>4)%2) 
'1' 

它也很常見,用&操作

>>> '{:b}'.format((1234>>4)&1) 
'1' 

如果你有一個數,其中第4位(從零)是零,你會得到一個零

>>> '{:b}'.format((1234+0b10000>>4)&1) 
'0' 
+0

謝謝,這也是一個很大的幫助,特別是格式 – 2013-04-30 22:42:27

0

作爲可替代的味道larsmans已經完整的解決方案,這是我如何理解它。 i >> j簡單地表示i/pow(2,j),其在數學上意味着i/2^j [顯然我們在整數空間中]。讓我們設置n = i/2^j。當你有n%2 == 1時,你問n mod 2是否爲1?如果是,那麼n必須是奇數,否則n必須是偶數。

來源: http://docs.python.org/2/reference/expressions.html