如何使用bitmask运算符

时间:2015-05-21 01:50:13

标签: c# bitmask

我正在学习一点面具。并找到了示例,但无法使其发挥作用。

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

  

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

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

2 个答案:

答案 0 :(得分:1)

  

(i & mask)只会导致{0,1}而不是

仅当(i & mask)mask时,

1才会在{0,1}中返回结果 - 也就是说,在初始迭代时。但是,只要maskmask <<= 1操作移位,下一个操作的结果就会在{0,2}中。随着掩码移位,可能的结果将变为{0,4},{0,8},{0,16}等等,因为掩码中设置为1的唯一位将移动到左

<<运算符使数字加倍的原因与在十进制数之后写入零的效果将数字乘以10的原因相同:将零添加到任意数的基数是与将该数字乘以base的值相同。

答案 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;
    }
}