2015-05-21 76 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的唯一位将移动到左侧。

<<运算符使数字加倍的原因与为什么在十进制数字后面写入零有将数字乘以十的效果的原因相同:将零附加到任何基数的数字与乘法相同这个数字由基数值表示。