繁体   English   中英

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

[英]Bit Manipulation (extract 5th bit from X and return number of 1 bits in X)

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

为了从XI中提取第5位,我想使用&operation来做这样的事情:XXXX1X&000010

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

谢谢!

计数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

提取第5位也很简单,只需将数字X右移5并用1计算逻辑AND:

unsigned int fifthBit (unsigned int X) {
   return (X >> 5) & 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;
}

这是如何运作的?

对于一个无符号数x ,比特在序列x - 1将成为补体x ,直到所述第一组位x从LSB计数。

x = 20 [0b11100] ; x - 1 = 19 [0b11011]
这里的位序列19是补体20直到第一组位20 (第一组位位置3处从LSB)。

因此,
如果你执行x & (x - 1) ,此操作将消耗x一个设置位。

因此,
如果你想继续这样做直到x变为0 ,你需要做多次,因为x有设置位,这反过来会给你x中设置位的计数。

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

作为补充,我精确,如果你正在寻找的效率,也有一些内置的硬件指令来执行对位计算(数零:你可以推断出多少个1-bit ,你有那么)看到此文章作为例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM