【问题标题】:Is there a better way to write code that test a value against a bit mask with ignoring selected bits?有没有更好的方法来编写代码来测试一个忽略选定位的位掩码的值?
【发布时间】:2025-12-01 14:55:01
【问题描述】:

因此,以下代码遍历一个字节 (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++;
            }
        }

【问题讨论】:

    标签: c# bitmask


    【解决方案1】:
    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)
    

    至于更高效,这在执行方面可以忽略不计,但在可读性/理解性方面是一个很大的改进。我不熟悉任何可以让您摆脱循环的技术,特别是如果您从用户那里接受价值,所以我认为这与您将获得的一样好。

    【讨论】:

      最近更新 更多