有人可以解释&这些例子中的运算符?

时间:2013-02-27 17:25:23

标签: c# operators bitwise-operators

我不明白这段代码发生了什么:

if ((_value & item.Value) == item.Value)
{
   item.IsSet = true;
}

在我正在查看的这个特定示例中,我看到以下内容:

如果_value为4103但item.Value为0,则为真。

如果_value为4103但item.Value为1,则为真。

如果_value为4103但item.Value为2,则为真。

如果_value为4103但item.Value为4,则为真。

如果_value为4103但item.Value为8,则不然。

如果_value为4103但item.Value为16,则不然。

如果_value为4103但item.Value为256,则不然。

如果_value为4103但item.Value为512,则不然。

如果_value为4103但item.Value为1024,则不然。

如果_value为4103但item.Value为2048则不然。

如果_value为4103但item.Value为4096,则为真。

在另一个例子中,我看到以下内容:

如果_value为51但item.Value为0,则为真。

如果_value为51但item.Value为1,则为真。

如果_value为51但item.Value为2,则为真。

如果_value为51但item.Value为4,则不然。

如果_value为51但item.Value为8,则不然。

如果_value为51但item.Value为16,则为真。

如果_value为51但item.Value为32,则为真。

有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:4)

按位AND,所以从你的例子开始:

(_value & item.Value) == item.Value

_value = 4103 = 1000000000111 binary
_item.Value = 0  = 0 binary

  1000000000111
& 0000000000000
---------------
  0000000000000

_value = 4103 = 1000000000111 binary
_item.Value = 4096  = 1000000000000 binary

  1000000000111
& 1000000000000
---------------
  1000000000000

答案 1 :(得分:4)

重写二进制数字,让我们跳过零情况:

if _value is 00110011 and item.Value is 00000001, it's true.
if _value is 00110011 and item.Value is 00000010, it's true.
if _value is 00110011 and item.Value is 00000100, it's false.
if _value is 00110011 and item.Value is 00001000, it's false.
if _value is 00110011 and item.Value is 00010000, it's true.
if _value is 00110011 and item.Value is 00100000, it's true.
if _value is 00110011 and item.Value is 01000000, it's false.
if _value is 00110011 and item.Value is 10000000, it's false.

你看到的模式?真实是相应位为1的位置,而falses是0的位置。

答案 2 :(得分:0)

来自 MSDN ;

&运算符可以用作一元二进制运算符。

对于integral类型,&计算其操作数的bitwise AND

对于bool个操作数,&计算其操作数的logical AND;也就是说,当且仅当其两个操作数均为true时,结果为true

因此,当您编写4103时,它实际上等于二进制1000000000111。你可以找到像这样的整数值的二进制表示;

int i = 4103;
Console.WriteLine (Convert.ToString(i, 2)); // 1000000000111

其余情况的处理是使用truth table进行简单计算。

  INPUT         OUTPUT
 A   B          A ∧ B
 T   T          T
 T   F          F
 F   T          F
 F   F          F

答案 3 :(得分:0)

这是一个按位AND运算符。本质上,当您对整数X和Y进行按位AND,然后将结果与Y进行比较时,请确保X在Y中设置为1的所有位也设置为1.X也可能将其他一些位设置为1,但是那些我们不关心的人。这是关于运营商的MSDN文章:

http://msdn.microsoft.com/en-us/library/sbf85k1c(v=vs.71).aspx