如何使用位掩码运算符

How use bitmask operator

我正在学习位掩码。并找到了示例,但无法使其正常工作。

我正在尝试计算一个数组的所有总和组合。 结果应该是

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

我的问题是 (i & mask) 应该只会导致 {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 + " - ");
        }

(i & mask) should only result in {0,1} and isn't

(i & mask) 应该 return 只有在 mask1 时才会在 {0,1} 中产生结果 - 也就是说,在初始迭代中。然而,一旦 maskmask <<= 1 操作移位,下一个操作的结果将在 {0,2} 中。随着掩码的移动,可能的结果将变为 {0,4}、{0,8}、{0,16} 等,因为掩码中唯一设置为 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;
    }
}