1

我得到了一個算法,其目標是給出Integer數組中所有組合的所有可能的總和。瞭解逐位條件檢查獲取Array中的所有可能組合的總和

private void arraySumPermutation(int value ,int[] arr){ 
    int N = arr.length;  
    for(int i=0;i<1<<N;i++){ 
     int sum = 0;     
     for(int j=0;j<N;j++){  

      if((i & 1<<j)>0){ 
       iCount++; 
       sum += arr[j]; 
       //S.O.P(sum); 
      } 
     } 

    } 
} 

我無法理解添加了按位AND的內部條件。 內部if循環的目標是什麼。

if((i & 1<<j)>0) 

回答

3

讓我們表示設定爲N位的數字,其中,第j位爲1 N元件的cominations如果j個項被包括在combintation,否則爲0。這樣,您可以將所有可能的組合表示爲範圍[0,2 N)中的數字。

在這些數字的外循環迭代(1 << N == 2 Ñ)。

內循環遍歷集合中的項目並且if條件檢查j th項目是否包含在當前組合中。換句話說,它檢查的ij個位是1

1<<j給你一個號碼,只有j個位爲1,i & (1 << j)重置所有其他i比比特位,導致不>檢查0

注意,該代碼(與int多個)僅適用對於N < 31.