位操作(从X中提取第5位并在X中返回1位数)

时间:2014-03-07 03:47:03

标签: c bit-manipulation

假设X是无符号整数,我将如何从X中提取第5位并返回X中的1位数。注意:这两个操作不相互依赖。

为了从X中提取第5位我正在考虑使用&操作做这样的事情:XXXX1X& 000010

我不确定如何在X中返回1位数。

谢谢!

3 个答案:

答案 0 :(得分:2)

计算1位数是相对简单的;迭代你的数字的所有位,并将一些累加器添加到设置的位数:

unsigned int X;     
unsigned int count; 

for (count = 0; X; X >>= 1) {
   count += X & 1;
}

工作原理:

  1. 将计数初始化为0
  2. 从MSB(最高位)开始[这是当前位]
  3. 添加以计算当前位的结果& 1
      如果设置了位,则
    • 1
    • 如果未设置该位,则
    • 0
  4. 将X向右移位1位,因此当前位现在是下一个MSB
  5. 重复步骤3
  6. 提取第5位也很简单,只需将数字X右移5并用1计算逻辑AND:

    unsigned int fifthBit (unsigned int X) {
       return (X >> 5) & 1;
    }
    

答案 1 :(得分:1)

查找int中设置位数的更简单,更简单的方法如下:

int num_1_bits(unsigned int x)  // or unsigned long x; or unsigned short x;
{
   int bitcount = 0;
   while(x)
   { 
      x &= (x - 1);
      ++bitcount;
   }
   return bitcount;
}

这是如何运作的?

对于无符号数xx - 1中的位序列将是x的补码,直到从{LS}计数的x的第一个设置位。

即。 x = 20 [0b11100]; x - 1 = 19 [0b11011]
这里19的位序列是20的补码,直到20中的第一个设置位(LSB位置3的第一个设置位)。

因此,
如果执行x & (x - 1),此操作将使用x中的一个设置位。

因此,
如果您希望在x成为0之前继续这样做,则需要执行x中设置位的次数,这反过来会为您提供设置x中的位。

此方法更好,因为循环的运行次数与1中的x位的次数相同,因此不依赖于x的数据类型。

答案 2 :(得分:0)

作为补充,我确切地说,如果你正在寻找效率,有一些内置的硬件指令来执行位计算(计数零:你可以推断出你有多少1-bit)看到这个{以{3}}为例。