c语言---一个数x中值为1的位数(3个版本)
2008-10-05 14:17
183 查看
![](http://www.cnitblog.com/Emoticons/QQ/01.gif)
/*版一*/
unsigned int bitcount(unsigned int x)
{
int b;
for(b=0;x != 0;x >>= 1)
{
if(x&01)
b++;
}
return b;
}
![](http://www.cnitblog.com/Emoticons/QQ/24.gif)
/*版二*/
unsigned int bitcount(unsigned int x)
{
int b;
for(b=0;x != 0;)
{
x &= (x-1); /* 这里的做用是每次都会在原的的数的基础上去掉一个1,贼酷 */
b++;
}
return b;
}
![](http://www.cnitblog.com/Emoticons/QQ/icon18.gif)
/*版三*/
unsigned int bitcount(register unsigned int x)
{
x -= ((x > > 1) & 0x55555555);
x = (((x > > 2) & 0x33333333) + (x & 0x33333333));
x = (((x > > 4) + x) & 0x0f0f0f0f);
x += (x > > 8);
x += (x > > 16);
return(x & 0x0000003f);
}
![](http://www.cnitblog.com/Emoticons/QQ/shifty.gif)
/*第3个版本的清晰版本*/
unsigned int bitcount(register unsigned int x)
{
x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);
return(x & 0x0000003f);
}
//进一步解释:看图吧,已经山穷水尽啦,如果还不明白请打120
/*其实这个算法很简单,就是把这个数中的所有的1都加起来就可以了*/![]()
![]()
相关文章推荐
- 一个UUID生成算法的C语言实现 --- WIN32版本
- 【C语言】输入一个不多于5位的正整数,要求:(1)输出它是几位数,(2)按逆序输出各位数字,(3)按顺序输出各位数字
- 利用C语言版本的数据库制作一个学生成绩管理系统
- 【C语言】写一个函数返回参数二进制中1的位数。
- 一个UUID生成算法的C语言实现 --- WIN32版本
- 一个UUID生成算法的C语言实现——WIN32版本
- C语言,判断一个5位数是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
- 一个UUID生成算法的C语言实现 --- WIN32版本
- /*算法从9个数中取出3个3位数其中两个3位数相加等于另一个3位数其中每位数字不能重复,c语言怎么实现*/
- 【C语言】计算一个数二进制中一的位数
- C语言求S(n) = a+aa+aaa+aaaa+...+aa..a之值,其中a是一个数字,n表示a的位数例如:2+22+222+2222+22222(此时n=5),n和a都从键盘输入。
- C语言:输入一个不确定位数的正整数,把位数翻转出来!
- 【c语言】给一个不多于5位的正整数,要求: 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字
- 一个UUID生成算法的C语言实现——WIN32版本
- 一个UUID生成算法的C语言实现 --- WIN32版本
- 神秘的三位数 有这样一个3位数,组成它的3个数字阶乘之和正好等于它本身。即:abc = a! + b! + c!
- 判断一个5位数是否是回文数字(C语言)
- 神秘的三位数 有这样一个3位数,组成它的3个数字阶乘之和正好等于它本身。即:abc = a! + b! + c!
- c语言之输入一个数并判断它是几位数
- C语言快速计算出一个无符号数一共有多少个“”1”位数的方法