如何使用位操作来查找第5位,并返回整数中的1位数

时间:2014-03-05 23:51:28

标签: c bit-manipulation

假设Z是无符号整数。使用〜,<<,>>,&,| ,+和 - 提供返回所需结果的语句。

如果需要,我可以引入新的二进制值。

我有这些问题:

1.从左侧 Z.

中提取第5位

为此我正在考虑做类似

的事情
  x x x x x x x x 
& 0 0 0 0 1 0 0 0 
___________________

  0 0 0 0 1 0 0 0 

这对于提取第五位是否有意义?当我不知道它的价值时,我不完全确定如何使用Z来完成这项工作。 (我对所有这些都比较新)。这种想法会起作用吗?

2.返回Z

中的1位数
Here I kind of have no idea how to work this out. What I really need to know is how to work on just Z with the operators, but I m not sure exactly how to. 

就像我说我是新手一样,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

问题1

你的钱是对的。我会做一个&和一个>>,这样你就可以得到一个好的0或1。

result = (z & 0x08) >> 3;

但是,这可能不是绝对必要的。例如,如果您正在尝试检查该位是否设置为if条件的一部分,则可以利用C对任何非零的定义为真。

if (z & 0x08)
        do_stuff();

问题2

a whole variety of ways这样做。根据该页面,以下方法可追溯到1960年,但直到1988年才在C中公布。

for (result = 0; z; result++)
        z &= z - 1;

究竟为什么一开始可能并不明显,但如果你通过一些例子,你会很快明白为什么会这样。

值得注意的是,此操作 - 确定一个数字中的1位数 - 对于拥有一个名称(人口数或Hamming weight)非常重要,并且在最近的Intel和AMD处理器上,{{3 }}。如果您正在使用GCC,则可以使用__builtin_popcount内在函数。

答案 1 :(得分:0)

问题1看起来是正确的,除非您应该通过将结果右移4来完成它以获得掩码之后的那一位。

要实现掩码,您需要知道单个第5位表示的整数。这个数字顺便说一下是2 ^ 5 = 32.所以你可以和32一起使用它并将它向右移动4。

问题2:

int answer = 0;
while (z != 0){  //stop when there are no more 1 bits in z

   //the following masks the lowest bit in z and adds it into answer
   //if z ends with a 0, nothing is added, otherwise 1 is added
   answer += (z & 1);
   //this shifts z right by 1 to get the next higher bit
   z >>= 1;
}
return answer;

答案 2 :(得分:0)

要找出第五位的值,你不关心底部的位,这样就可以摆脱它们了:

unsigned int answer = z >> 4;

第五位成为底部位,因此您可以使用按位AND去除它:

answer = answer & 1;

要查找数字中的1位数,您可以应用stakSmashr的解决方案。如果您知道需要计算许多整数中的位数,则可以进一步优化这一点 - 预先计算每个可能的8位数中的位数并将其存储在表中。表中只有256个条目,因此不会占用太多内存。然后,您可以一次循环数据一个字节,并从表中找到答案。此查找将比在每个位上再次循环更快。