判断一个数中的二进制中有几个1

来源:互联网 发布:台北故宫知乎 编辑:程序博客网 时间:2024/05/11 01:28

介绍几种计算一个数中有几个1的算法


1.我们可以快速写出下面的代码:
int countOne(int n){int count = 0;while (n){if (n&1){count++;}n >>= 1;}return count;}
//这种算法没有办法处理负数,否则会产生死循环


2.解决了负数的死循环问题

//我们可以不把数字向右移动,而移动一个表计量

int countOne1(int n){int count = 0;unsigned int flag = 1;while (flag){if (n&flag){count++;}flag <<= 1;}return count;}

//但是这个代码也有个缺陷,就是32为的数要循环移动32次


3.这个算法,数字中有多少个1就移动多少次

int countOne2(int n){int count = 0;while (n){count++;n = (n - 1)&n;}return count;}

4.最后介绍一种速度不一定最快,但是想法很绝妙的算法。就是将n写成二进制形式,然后相邻位相加,重复这个过程,只到剩下一位。

int BitCount(unsigned int n){    n = (n &0x55555555) + ((n >>1) &0x55555555) ;    n = (n &0x33333333) + ((n >>2) &0x33333333) ;    n = (n &0x0f0f0f0f) + ((n >>4) &0x0f0f0f0f) ;    n = (n &0x00ff00ff) + ((n >>8) &0x00ff00ff) ;    n = (n &0x0000ffff) + ((n >>16) &0x0000ffff) ;    return n ;}





1 0
原创粉丝点击