一个函数返回参数二进制中的1的个数
2017-11-23 16:01
232 查看
正数的原反补码相同,我们要统计二进制位中一的个数,那就需要拿出三十二位bit位中的每一位,然后按位 &1,如果这一位的数字是1,那么完成&1的运算之后就会得到1,在之前先定义一个计数器,当出现1的时候,计数器就count++;然后再把剩下的31位数字整体右移一位,然后就可以继续执行按位&1的操作了,总共把之前的操作重复32次,就可以知道一个数字的二进制数中到底有多少个1.
同样的,我们也可以用这种办法来测试一下一个数字转换为二进制数字之后有多少个0,但是需要注意转换。
下面附上代码
#include<stdio.h>
#include<stdlib.h>
int main()
{ int n=0;
int i=0;
int count=0;
printf("please input a integer number:\n");
scanf("%d",&n);
for(i=0;i<=32;i++) //for循环控制右移次数,最多32次
{
if(((n>>i)&1)==1) //将右移的结果&1
{
count++; //是1则计数器+1
}
}
printf("%d\n",count);
system("pause");
return 0;
}
在这里顺便说一下,-1有32个1,因为它是补码的存在形式,它的源码最高位为1,其他为0,然后存储时按补码存储,补码是最高位不变,其他按位取反,所以就出现了32个1.
但是,这个程序美中不足的地方就在于当它每次执行完按位与的操作之后,整体都需要右移一次,时间复杂度大大增加,在这里,我再说一种简单的方法,我就用一些0和1来表示一个二进制数字,给你们演示一下这种算法是如何实现功能的。
首先,我写一串数字来表示10 1010
然后,我把这一整串数来表示9 1001 每次相与都会去掉一个1
然后把10 &9,得到 1000
一直进行n&(n-1) 0111
0000 最后1就全部被去掉了
具体代码我就不打了,这个程序相比上面的那个,就优化了很多,因为这个程序是一个二进制数字有几个1才循环相应的次数,最坏的情况下有32个1,才循环32次,如果只有3个或者4个,那只需要循环三次四次,大大减少了运行时间,所以我比较推荐这种。
同样的,我们也可以用这种办法来测试一下一个数字转换为二进制数字之后有多少个0,但是需要注意转换。
下面附上代码
#include<stdio.h>
#include<stdlib.h>
int main()
{ int n=0;
int i=0;
int count=0;
printf("please input a integer number:\n");
scanf("%d",&n);
for(i=0;i<=32;i++) //for循环控制右移次数,最多32次
{
if(((n>>i)&1)==1) //将右移的结果&1
{
count++; //是1则计数器+1
}
}
printf("%d\n",count);
system("pause");
return 0;
}
在这里顺便说一下,-1有32个1,因为它是补码的存在形式,它的源码最高位为1,其他为0,然后存储时按补码存储,补码是最高位不变,其他按位取反,所以就出现了32个1.
但是,这个程序美中不足的地方就在于当它每次执行完按位与的操作之后,整体都需要右移一次,时间复杂度大大增加,在这里,我再说一种简单的方法,我就用一些0和1来表示一个二进制数字,给你们演示一下这种算法是如何实现功能的。
首先,我写一串数字来表示10 1010
然后,我把这一整串数来表示9 1001 每次相与都会去掉一个1
然后把10 &9,得到 1000
一直进行n&(n-1) 0111
0000 最后1就全部被去掉了
具体代码我就不打了,这个程序相比上面的那个,就优化了很多,因为这个程序是一个二进制数字有几个1才循环相应的次数,最坏的情况下有32个1,才循环32次,如果只有3个或者4个,那只需要循环三次四次,大大减少了运行时间,所以我比较推荐这种。
相关文章推荐
- 写一个函数返回参数二进制中1的个数
- 1.写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1 程序原型: int count_one_bits(unsigned int valu
- 【c语言】 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中 1 的个数,获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 总结:写一个函数返回参数二进制中 1 的个数
- C实现 一个函数返回参数二进制中1的个数(面试题)
- 今日学习--写出一个函数返回参数二进制中一的个数
- 1. 给定两个整形变量的值,将两个值的内容进行交换。 2. 不允许创建临时变量,交换两个数的内容(附加题) 3. 求10 个整数中最大值。 4. 写一个函数返回参数二进制中 1 的个数
- [置顶] 写一个函数返回参数二进制中1的个数
- 写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1
- 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中 1 的个数
- 求十个数中的最大的数,写一个函数返回一个参数中二进制形式中1的个数。
- 【C语言】编写一个函数返回参数二进制中1的个数。
- 用一个函数返回参数二进制中1的个数
- 写一个函数返回参数二进制中 1 的个数
- 写一个函数返回参数二进制中1的个数
- 写一个函数返回参数二进制中1的个数