【问题标题】:Can someone explain the & Operator in these examples?有人可以在这些示例中解释 & 运算符吗?
【发布时间】:2013-02-13 15:05:01
【问题描述】:

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

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,那就是真的。

谁能给我解释一下?

【问题讨论】:

  • 提示:用 binary 而不是 decimal 写的所有数字重写您的问题。模式会变得非常清晰。 (从 51 示例开始;它会更快。)
  • 为什么,@EricLippert,我似乎总是发布答案,然后看到你添加的一些评论,然后想“开枪,我应该说那个” ? :)

标签: c# operators bitwise-operators


【解决方案1】:

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

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 时为真,为 0 时为假。

【讨论】:

    【解决方案2】:

    来自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】:

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

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

      【讨论】:

        【解决方案4】:

        按位与,所以从你的例子来看:

        (_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
        

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 1970-01-01
          • 2011-04-05
          • 2023-03-09
          • 2014-11-20
          • 2018-03-03
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          相关资源
          最近更新 更多