2017-01-23 55 views
2

我看到的算法,例如:爲什麼此算法在Java中使用按位和運算符?

for (int i = 1; i < sums.length; i++) { 
     /* 
     * dynamic programming: 
     * 1. remove a single block from the current subset of blocks 
     * 2. the corresponding block sum was already calculated 
     * 3. add the number on the removed block to it 
     * 
     * here: always choose the block corresponding 
     * to the least significant bit of i 
     */ 
     int t = Integer.numberOfTrailingZeros(i & -i); 
     sums[i] = sums[i & ~(1 << t)] + block[t]; 

     //only add block subsets that add up to a face 
     if (masks.containsKey(sums[i])) 
      masks.get(sums[i]).add(i); 
    } 

據評論,在該線(INT噸= Integer.numberOfTrailingZeros(I & -i);)撰文表示選擇在一個元件根據數字i的最低有效位分塊數組。

爲什麼作者在i和-i上使用按位和運算符?他們不能只使用我(例如,Integer.numberOfTrailingZeros(i))?

這裏是代碼體形較大的背景下:http://pastebin.com/YB9wsdgD

回答

2

呀,你能做到這一點。幾乎沒有合理的解釋:

  • 原始版本移植到有家釀版本的東西,他在那裏留下了這個訣竅。
  • 不明白,Integer.numberOfTrailingZeros()不關心是否有其他重要的位,並知道如何快速得到最重要的位的值。
  • 或者最初是一個家庭釀造版本,剛剛使用我& -i和bitshifted,直到值爲零,並設置等於噸。有人用內置代替了那個操作,卻沒有意識到我是一個把這個工作刪除的操作工作的技巧。對零進行檢查比其他檢查快,雖然它已經不再重要了,所以一些超優化的人經常會安排檢查零的東西,特別是如果他們不需要減去的話。

for (var i = 0; i < 1000; i++) { 
 
    document.write(i & -i); 
 
    document.write('<br>'); 
 
}

第i & -i返回2S的二進制表示補充這就是說翻轉所有的位和添加一種。因此,它只會以進位的二進制數量結束。然後,您可以確定二進制表示中的1之後有多少個零。通常通過移位直到找到1,並且移位的數量是數字在最不重要的地方有多少個零。這可以用於移位直到你有一個零。儘管整數的代碼版本不需要。

+0

請將代碼調整爲Java。 –

+0

我只是試圖展示我和-i的樣子。它不打算以任何其他方式有所幫助。我不認爲有Java代碼與網頁中內置的「運行代碼片段」按鈕。 – Tatarize

+0

但將var更改爲int,並將document.write()更改爲System.println()並刪除約
Tatarize

相關問題