我不确定这些运营商正在做什么:
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
*/
但是,它做了什么?
答案 0 :(得分:7)
它们是&
和|
运算符和赋值的组合。 a &= b
与a = a & b
做同样的事情。
&
和|
是按位和以及或运算符。 &
是其操作数中所有位的交集,|
是并集:
10011100101
& 00100011110
-------------
00000000100
10011100101
| 00100011110
-------------
10111111111
基本上,当您在两个数字上使用&
时,所有位都设置为在两个操作数中设置,而使用|
时所有位都设置为在至少一个操作数中设置。
答案 1 :(得分:2)
那些是按位运算符。 &
表示逻辑AND运算符,|
表示OR。对于NOT,还有~
,对于XOR,还有^
。
在您的示例中,它只是计算两个二进制值之间的AND:1100 AND 0110 = 0100
(在输出中为4)。第二个可以被视为1 AND 0 = 0
。
您可以参考真值表以了解它的确切工作原理:AND operation,OR operation
但是,最常见的用法之一是使用枚举。例如,假设你有一周的日子
[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
答案 2 :(得分:1)
这些是标准按位运算符AND(&)和OR(|)的快捷方式。
a &= 0x06;
相当于:
a = a & 0x06
有关AND和OR的说明,请参阅this wikipedia article。