如何从一个整数中获取单个比特位?

3
我明白:

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

会给我从左侧数第三个位置的比特位,假设8是1000,那么就是0001。
我不明白的是"& 1"如何移除除了最后一位以外的所有内容,显示一个简单的"1"输出。我知道这行代码能够工作,我知道如何从一个整数中获取比特位,但是这段代码是如何提取单个比特位的呢?
代码...
int number = 8;
int bit = (number >> 3) & 1;
Console.WriteLine(bit);

@Kapol 是的,那是正确答案,假设 OP 的意思是“右边”而不是“左边”。 (否则,对于问题中的示例也不正确。)16进制的二进制表示为10000,从右边开始计数第3位是0。 - user743382
@Kapol 嗯,你说的没错,只是它取的是 number>>3 的最低有效位。 :) - user743382
你也可以使用 bit = number & 8 来获得相同的结果。 - Georg
@Georg,实际代码中数字部分可能是可变的。 - Gusdor
抱歉,我删除了我的评论,因为我认为"&1"部分应该每次返回比特值(例如,16>>3应该是1)。既然这只需要在那种特殊情况下工作,那么我对一切都满意。 - Kapol
4个回答

3
除非我的布尔代数学习失败了,否则正在发生的事情应该等同于以下内容:
              *
  1100110101101  // last bit is 1
& 0000000000001  // & 1
= 0000000000001  // = 1

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

当你执行& 1时,基本上你所做的就是将除了最后一位以外的所有其他位都清零,而最后一位将保持不变。或者更加技术化地说,你在两个数字之间执行按位与操作,其中一个数字恰好为1,并且所有前导位都设置为0

为了扩展,这里的&运算符被称为_按位与_。简单来说; 如果操作数ab中的相同位都被设置,则会得到true(1,一个设置的位)。http://en.wikipedia.org/wiki/Bitwise_operation#AND - Gusdor
我的问题的目的是为了我能够充分理解从整数获取单个位的过程。我理解位置的代码。根据您的答案,我现在明白了"& 1"是什么以及它是如何工作的。谢谢 :) - AaronParkes
@AaronParkes 很高兴听到我正确地解释了它 ;) - Svish

0
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     

0

当您将8右移时,您会得到0001
0001 & 0001 = 0001,转换为int后会得到1。

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


我没有给它点踩,但那是因为你没有回答他的问题。你的回答只是重复了他已经理解的内容。 - Svish
其实,我不知道这个问题为什么那么难理解。一个整数值为1的时候,打印出来的就是1,而不是前导零。我曾经提到过按位与运算会得到1,我的意思是得到的是1,而不是0001。无论如何。 - Shakti Prakash Singh

0

其实这并不难理解。"& 1" 操作只是将值的所有位设置为 "0",除了在值 "1" 中宝贵位所在的位置上的位。

之前的操作只是将所有位向右移动,并将已检查的位放到位置上,在 "& 1" 操作后不会被设置为 "0"。

例如

数字是 1011101

数字 >> 3 变成 0001011

但 (数字 >> 3) & 1 变成 0000001


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接