2015-05-21 37 views
-1

我正在學習位掩碼。發現和示例,但無法使其工作。如何使用位掩碼運算符

我想從一個數組中計算所有總和組合。 結果應該是

0 - 1 - 2 - 3 - 3 - 4 - 5 - 6

我的問題是與(i &掩模)應該只導致{0,1}並不是。 反而在生產。

0 - 1 - 4 - 5 - 12 - 13 - 16 - 17

 int[] elem = new int[] { 1, 2, 3 }; 

     double maxElem = Math.Pow(2, elem.Length); 

     for (int i = 0; i < maxElem; first++) 
     { 
      int mask = 1, sum = 0; 
      for (int run = 0; run < elem.Length; run++) 
      { 
       sum += elem[run] * (i & mask); 
       mask <<= 1; 
      } 
      Debug.Write(sum + " - "); 
     } 
+1

'i&mask'將產生0或'mask',而不是0或1:例如。 '0110b&0100b == 0100b'和'1010b&0100b == 0000b' – Blorgbeard

+0

在你的情況下'mask'是2 ^'run',這意味着只設置一個位 - 不是它是1或0 – BrokenGlass

+0

@Blorgbeard I對於所有組合,想要總和{0,1} elem [0] + {0,1} elem [1] + {0,1} elem [2]。我認爲{0,1}的變化可以通過位掩碼序列來解決。 –

回答

1

好吧,我解決它創建一個IF。

int[] elem = new int[] { 1, 2, 3 }; 
double maxElem = Math.Pow(2, elem.Length); 

for (int i = 0; i < maxElem; first++) 
{ 
    for (int run = 0; run < elem.Length; run++) 
    { 
     int mask = 1, sum = 0; 
     if ((i & mask) > 0) // ADD THIS LINE 
     { 
      sum += elem[run];      
     } 
     mask <<= 1; 
    } 
} 
1

(i & mask)應該只導致{0,1},而不是

(i & mask)只有當mask1時,即在初始迭代時,纔會在{0,1}中返回結果。但是,只要mask移動了mask <<= 1操作,下一個操作的結果將在{0,2}中。當掩碼被移位時,可能的結果將變爲{0,4},{0,8},{0,16}等等,因爲在掩碼中設置爲1的唯一位將移動到左側。

<<運算符使數字加倍的原因與爲什麼在十進制數字後面寫入零有將數字乘以十的效果的原因相同:將零附加到任何基數的數字與乘法相同這個數字由基數值表示。