我不明白这段代码发生了什么:
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,则为真。
有人可以向我解释一下吗?
答案 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