右移与按位AND

时间:2016-07-22 17:53:56

标签: c bit

来自top answer的解决方案

  

要检查一下,将数字x向右移动,然后按位向右移动:

     

bit = (number >> x) & 1;

     

这会将位x的值放入变量位。

在假设以下内容时,让我感到困惑的是:

unsigned number = 5; //0101
int x = 2; //

转变(number >> x)后,我们得到0001。但是我们移位了第1位和第2位,所以当我们执行按位AND 时,我们不是在对第三位而不是第二位进行它em>,x = 2?这是不是意味着如果我想检查是否设置了位x,我不应该这样做:

 bit = (number >> (x - 1)) & 1);

3 个答案:

答案 0 :(得分:5)

是的,你正在对第三位进行按位AND。将map视为零索引,即第一位为位0。

答案 1 :(得分:2)

你说:

  

转变(number >> x)后,我们得到0001。但是我们将第1位和第2位移开了,所以当我们执行按位AND 时,我们不会对第三个​​位而不是第二位执行此操作,其中x = 2?这不意味着如果我想检查是否设置了位x,我不应该这样做:

bit = (number >> (x - 1)) & 1);

要获得第1个最低有效位的值,您需要(number >> 0) & 1 要获得第二个最低有效位的值,您需要(number >> 1) & 1 要获得第3个最低有效位的值,您需要(number >> 2) & 1

换句话说,

1st意味着0位移位
第二个意味着1位移位
第3个意味着2位移位
Nth意味着移位N-1位

我希望这对你来说更清楚一点。

答案 2 :(得分:0)

位数表示2的幂。因此,当x为2时,您所说的是第2位= 2 ** 2 = 4。

最低有效位(或者如果你喜欢它,那么最右边的位是0位,而不是位1。

此外,没有理由实际进行位移,除非您的位数为'是一个变量。

例如,要测试值的第5位,只需执行

if (variable & 0x20)
    bit_is_set();

此处0x20只是2 ** 5,(或1 <&lt;&lt; 5)