因此,以下代码遍历字节(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++;
}
}
答案 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)
就效率而言,这在执行方面的优化可以忽略不计,但在可读性/理解性方面却有很大的提高。我不熟悉让您摆脱循环的任何技术,特别是如果您正在接受用户的值,那么我想这与您将要获得的效果一样好。>