因此,下面的代码将遍历字节(0-255)中的所有值,并打印适合指定位掩码的值。通常情况下,这不会是一个问题(因为常规的“值&掩码”只检查设置位),但是由于我想忽略一些位,并确保其中一些位是零,所以对其进行检查的代码最终看起来有点长,效率也不高。
我会解释更多关于代码的细节。用于测试代码的位掩码如下: 0-1--10-
破折号是指被忽略的位元。为了找出哪些位应该被忽略,我将代码中的掩码分成两个单独的掩码。第一个是“掩码”变量,它保存应该设置的位。第二个掩码“忽略”清除了应该忽略的比特。这样,代码就可以在“掩码”中区分被清除的位和要忽略的位。我使用的值为00100100 (36)用于掩码,10100110 (166)用于忽略。
代码确实正确地返回了期望值:
0x24 0x25 0x2C 0x2D 0x34 0x35 0x3C 0x3C 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++;
}
}发布于 2019-06-25 22:47:21
if ((val & ignore) == mask)...gives相同的输出。
我认为你的术语可能会让这件事看起来更复杂。ignore应该被称为mask,因为您使用它来屏蔽(用零) val中不重要的位。您所称的mask是该操作的预期结果。
byte expected = 0b_0010_0100; // was mask
byte mask = 0b_1010_0110; // was ignore
// ...
if ((val & mask) == expected)至于效率更高,这在执行方面是一个微不足道的优化,但在可读性/理解方面是一个很大的改进。我不熟悉任何允许您摆脱循环的技术,特别是当您接受来自用户的值时,所以我认为这是您将要得到的最好的方法。
https://stackoverflow.com/questions/56762693
复制相似问题