请解释为什么通过以下操作,我会在i
的内部代表中获得存储在其中的第二位数字。
(i & 2) / 2;
答案 0 :(得分:4)
i & 2
除了i
中的第二位以外的所有屏蔽。 [1] 0
或2
(二进制00
和10
)。2
除以0
或1
,这实际上是i
中第二位的值。例如,如果i = 7
,即二进制中的0111
:
i & 2
提供0010
。0010
的小数为2
。2/2
提供1
,即0001
。 [1] &
是C中的按位AND。有关按位AND如何工作的说明,请参阅here。
答案 1 :(得分:2)
i & 2
掩盖了除第二位以外的所有内容。
将其除以2与向下移1位相同。
e.g。
i = 01100010
(i & 2) == (i & 00000010) = 00000010
(i & 2) / 2 == (i & 2) >> 1 = 00000001
答案 2 :(得分:1)
&
运算符是按位AND:对于每个位,只有当两个参数的相应位都为1时,结果才为1.由于数字2中的唯一1位是第二低位,按位与2将强制所有其他位为0.如果(i & 2)
中的第二位置位,则i
的结果为2,否则为0。
除以2只是在设置i
的第二位时将结果更改为1而不是2。如果您只关心结果是零还是非零,则没有必要。
答案 3 :(得分:0)
2
是二进制的10
。 &
是一个按位conjunction。因此,i & 2
可以获得i
的第二位。除以2与向右移位1相同,得到最后一位的值。
实际上,向右移动会更好,因为它清楚地表明了你的意图。因此,此代码通常如下所示:(i & 0x02) >> 1