3

我不确定这些运营商正在完成什么:

byteInfo[x, y, z] |= (byte)info;

也:

byteInfo[x, y, z] &= (byte)255 - (byte)info;

来自 msdn:

class AndAssignment
{
    static void Main()
    {
        int a = 0x0c;
        a &= 0x06;
        Console.WriteLine("0x{0:x8}", a);
        bool b = true;
        b &= false;
        Console.WriteLine(b);
   }
}

/*
Output:
0x00000004
False
*/

但是,它做了什么?

4

3 回答 3

7

它们是&and|运算符和赋值的组合。a &= b正在做同样的事情a = a & b

&and|是按位运算符。&是其操作数中所有位的交集,|是并集:

  10011100101
& 00100011110
-------------
  00000000100

  10011100101
| 00100011110
-------------
  10111111111

基本上,当您在两个数字上使用时&在两个操作数中设置的| 所有位都被设置,而在至少一个操作数中设置的所有位都被设置。

于 2013-06-18T04:34:27.243 回答
2

这些是按位运算符。&表示逻辑 AND 运算符和|OR。也有~NOT 和^XOR。

在您的示例中,它只是计算两个二进制值之间的 AND:(1100 AND 0110 = 0100即 4,如您的输出所示)。第二个可以看成1 AND 0 = 0。你可以参考真值表来看看它是如何工作的:AND运算OR运算

但是,最常见的用途之一是枚举。例如,假设您有一周中的几天

[Flags]
public enum DaysOfTheWeek
{
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x16,
    Friday = 0x32,
    Saturday = 0x64
}

您可以使用按位运算符轻松分配值。例如,如果您想表示周末,您可以使用 OR 运算符来设置二进制标志:

DaysOfTheWeek weekend = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;

要检查一个值是否包含正确的标志,您可以使用 AND 运算符:

bool isSundayAWeekend = (weekend & DaysOfTheWeek.Sunday) == DaysOfTheWeek.Sunday
于 2013-06-18T05:52:41.233 回答
1

这些是标准位运算符 AND (&) 和 OR (|) 的快捷方式。

a &= 0x06;

相当于:

a = a & 0x06

有关 AND 和 OR 的说明,请参阅此维基百科文章

于 2013-06-18T04:35:56.240 回答