【问题标题】:How am I getting a single bit from an int?我如何从 int 中获取一点信息?
【发布时间】:2014-02-21 15:10:22
【问题描述】:

我明白:

int bit = (number >> 3) & 1;

将给我从左边 3 位的位,所以假设 8 是 1000,那么就是 0001。

我不明白“& 1”如何删除除最后一位之外的所有内容以显示简单的“1”输出。我知道这是可行的,我知道如何从 int 中获取一些信息,但是代码是如何提取单个位的?

代码...

int number = 8;
int bit = (number >> 3) & 1;
Console.WriteLine(bit);

【问题讨论】:

  • @Kapol 是的,这是正确的答案,假设 OP 的意思是“右”而不是“左”。 (否则,问题中的示例也不正确。)二进制中的 16 是 10000,从右数第 3 位,从 0 开始,为 0。
  • @Kapol 好吧,你没看错,只是它占用了number>>3 的最低有效位。 :)
  • 您也可以只使用bit = number & 8 并获得相同的结果。
  • @Georg 数字部分可能在实时代码中是可变的。
  • 对不起,我删除了我的 cmets,因为我认为“& 1”部分应该每次都返回位值(例如 16 >> 3 应该是 1)。由于这只需要在特定情况下工作,所以我对一切都很好。

标签: c# bit-manipulation bitwise-operators


【解决方案1】:

除非我在学校的布尔代数不及格,否则发生的事情应该等同于以下内容:

              *
  1100110101101  // last bit is 1
& 0000000000001  // & 1
= 0000000000001  // = 1

              *
  1100110101100  // last bit is 0
& 0000000000001  // & 1
= 0000000000000  // = 0

因此,当您执行& 1 时,您基本上所做的是将所有其他位清零,除了最后一位将保持原样。或者从技术上讲,您在两个数字之间进行按位与操作,其中一个恰好是1,所有前导位都设置为0

【讨论】:

  • 展开,这里的& 运算符称为按位与。用简单的英语;如果在操作数a AND b en.wikipedia.org/wiki/Bitwise_operation#AND
  • 我提出问题的目的是为了让我能够完全理解从整数中获取单个位的过程。我理解的职位代码。从您的回答中,我现在了解“& 1”是什么以及它是如何工作的,谢谢:)
  • @AaronParkes 很高兴听到我的解释正确;)
【解决方案2】:
8      = 00001000
8 >> 1 = 00000100
8 >> 2 = 00000010
8 >> 3 = 00000001


If you use mask 1 = 000000001 then you have:
8 >> 3       = 000000001
1            = 000000001
(8 >> 3) & 1 = 000000001     

【讨论】:

    【解决方案3】:

    其实这并不难理解。 “&1”操作只是将值的所有位设置为“0”,除了与值“1”中有价值的位放置在相同位置的位

    之前的操作只是将所有位向右移动。并将校验位置于操作“& 1”后不会设置为“0”的位置

    例子

    号码是1011101

    数字 >> 3 使它成为 0001011

    但是 (number >> 3) & 1 使它成为 0000001

    【讨论】:

      【解决方案4】:

      当你右移 8 时你得到 0001
      0001 & 0001 = 0001 转换为 int 给你 1。

      因此,当将值 0001 分配给 int 时,它将打印 1 而不是 0001 或 0000 0001。所有前导零都将被丢弃。

      【讨论】:

      • 我没有投反对票,但那是因为你没有回答他的问题。你的回答只是重复了他所说的他已经理解的内容。
      • 好吧,我不知道是否很难理解 int 值 1 将打印 1 而不是前导零。我确实提到过安定会给出 1,我的意思不是 0001,而是 1。无论如何。
      猜你喜欢
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2020-09-07
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      相关资源
      最近更新 更多