位移相关的算法举例
问题:在一个unsigned int 变量查找位为1的个数。
可参看:https://en.wikipedia.org/wiki/Hamming_weight
经过自己的思考我整理出如下程序:
#include <stdio.h>
int oneBitCount(unsigned long long n)
{
unsigned int c =0 ;
while (n >0)
{
if((n &1) ==1) //每一位最低有效位和1做与操作,如果为1 则‘1’的数量加1
++c ;
n >>=1 ;//n向右位移一位
}
return c ;
}
int main(){
unsigned long long test=0x1111111111111111;
printf("%d\n",oneBitCount(-1));
printf("%d\n",oneBitCount(test));
return 0;
}
测试结果:
[root@bogon haiming]# ./a.out
64
16
延伸阅读
[1]. https://en.wikipedia.org/wiki/Hamming_weight
[2]. https://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html
[3]. https://blog.youkuaiyun.com/wangjun_1218/article/details/4464129
[4]. http://www.cplusplus.com/reference/bitset/bitset/
[5]. https://en.wikipedia.org/wiki/Two%27s_complement