![](/img/trans.png)
[英]How to use bit manipulation to find 5th bit, and to return number of 1 bits in an integer
[英]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;
}
这个怎么运作:
提取第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.