编程实现求一个整数的二进制中0和1的个数
来源:互联网 发布:淘宝这么把排名搞前 编辑:程序博客网 时间:2024/05/17 06:41
声明:假定该数是在32位平台的机器上运行,在更高或最低平台上的原理相同。
核心最优算法:
求1的个数:num&=(num+1)
求0的个数:num |=(num+1)
问题分析:
因为开始时已声明该数是在32位机器上,因此该整数的二进制位总共有32位。
一般思路:采用for循环的方式,因为我们已经知道循环的次数,所以程序只要跑32次,每次将最低位模2,来判断最低位是0还是1,从而达到计数的目的。
优化思路:在实际运用中,我们所测的数一般不会很大,数的最前面可能已经出现了全0的情况,因此我们采用上面提供的核心最优算法来解决这一效率问题。
图示分析(以25为例):
代码实现:
计算二进制中1的个数:
int CountOneBit(int num){int count = 0;/*for (int i = 31; i > 0; i++)//一般的实现方式{if (num % 2 == 1){count++;}else{continue;}}*/while (num){count++;num &= (num - 1);//算法转换}return count;}int main(){int value = 25;int ret = CountOneBit(value);printf("%d中的二进制位1的个数有%d\n",value, ret);system("pause");return 0;}
程序运行结果:
计算二进制中0的个数:
int CountZeroBit(int num){int count = 0;/*for (int i = 31; i > 0; i++)//一般的实现方式{if (num % 2 == 0){count++;}else{continue;}}*/while (num + 1){count++;num |= (num + 1);//算法转换}return count;}int main(){int value = 25;int ret = CountZeroBit(value);printf("%d的二进制位中0的个数为%d\n",value, ret);system("pause");return 0;}
运行结果:
一点小技巧:
上述的算法也可以只掌握一种,通过总的平台为数减去其中的一个就可以求出另外一个的位数,同时也可以用来验证计算的结果。
0 0
- 编程实现求一个整数的二进制中0和1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数
- 求一个整数的二进制中1的个数(转)
- 求一个整数的二进制中1的个数(转)
- 求一个整数的二进制数中1的个数
- 求一个整数的二进制表示中1的个数
- Java求一个整数的二进制中1的个数
- 蓝桥杯:错误票据
- spring的困惑--org.springframework.web.servlet.DispatcherServlet noHandlerFound
- SQL语句映射文件(2)增删改查、参数、缓存
- 大数定律
- css的px,em,rem的区别
- 编程实现求一个整数的二进制中0和1的个数
- OkHttpClientManager
- Volley 使用一
- iOS --- UI系类之UITextField
- Android
- 什么是 MVVM 模式?
- 嵌入式Linux下ntp移植
- C#的一些多线程常用类
- 动态SQL语句