假设X是无符号整数,我将如何从X中提取第5位并返回X中的1位数。注意:这两个操作不相互依赖。
为了从X中提取第5位我正在考虑使用&操作做这样的事情:XXXX1X& 000010
我不确定如何在X中返回1位数。
谢谢!
答案 0 :(得分:2)
计算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;
}
答案 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;
}
这是如何运作的?
对于无符号数x
,x - 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}}为例。