有没有更好的方法编写代码来忽略位而针对位掩码测试值?

时间:2019-06-25 22:11:01

标签: c# bitmask

因此,以下代码遍历字节(0-255)中的所有值,并打印适合指定位掩码的值。通常,这不会有问题(因为常规的“值和掩码”仅检查设置的位),但是由于我想忽略一些位并确保某些位为零,因此检查该位的代码看起来像是时间太长,效率不高。

我将解释代码的更多细节。 我用来测试代码的位掩码如下:0-1--10-

破折号是指被忽略的位。为了找到应该忽略的位,我将代码中的掩码分为两个单独的掩码。第一个是“掩码”变量,其中包含应设置的位。第二个掩码“忽略”清除了应忽略的位。这样,代码可以将清除的位与一个位区分开,以在“掩码”中忽略。我使用的值是用于遮罩的00100100(36)和用于忽略的10100110(166)。

代码确实正确返回期望值:

  

0x24   0x25   0x2C   0x2D   0x34   0x35   0x3C   0x3D   0x64   0x65   0x6C   0x6D   0x74   0x75   0x7C   0x7D

有什么方法可以使这段代码更高效,甚至可能只有一个掩码来测试该值?

        private void button1_Click(object sender, EventArgs e)
        {
            byte mask = (byte)(Int32.Parse(textBoxMask.Text));
            byte ignore = (byte)(Int32.Parse(textBoxIgnore.Text));

            ushort i = 0;
            byte val;

            while(i <= 0xFF)
            {
                val = (byte)i;

                if (((val & ignore & mask) == mask) && ((~(val) & ~(mask) & ignore) == (~(mask) & ignore)))
                {
                    Console.WriteLine(string.Format("{0:X}", val));
                }

                i++;
            }
        }

1 个答案:

答案 0 :(得分:2)

if ((val & ignore) == mask)

...给出相同的输出。


我认为您的术语可能会使这看起来更加复杂。 ignore应该被称为mask,因为您正在使用它来掩盖val中不重要的位(用零)。您所说的mask是该操作的预期结果。

byte expected = 0b_0010_0100;  // was mask
byte mask = 0b_1010_0110;      // was ignore

// ...

if ((val & mask) == expected)

就效率而言,这在执行方面的优化可以忽略不计,但在可读性/理解性方面却有很大的提高。我不熟悉让您摆脱循环的任何技术,特别是如果您正在接受用户的值,那么我想这与您将要获得的效果一样好。