二进制数中返回1的个数的几种方法
来源:互联网 发布:数据存储安全 编辑:程序博客网 时间:2024/06/07 18:56
方法一:采用先模2再除2的方法,例如13模2结果是1,这个1就是二进制数中最后一个1,再除以2去除这一个位1,以此往复循化,当二进制数全是零的时候就没有1了,循环结束。但是此方法只适用于正数。
int main(){
int num = 13;//1101int count = 0;while (num!=0)//二进制数全是零的时候就没有1了{if (num % 2 == 1)count++;num = num / 2;} printf("count=%d\n", count);
}方法二:每次按位与1得到二进制数最右边的一位,再按位移1。例如13,按位与1最右边一位是1,再按位移一,让最后一位的前一位来到最低位,再按位与1,以此循环。
缺点:不管这个数二进制序列有几个1都会循环32次,效率会差一点。
int main(){int num = 13;int count = 0; int i = 0;for (i = 0; i < 32; i++){if ((num >> i) & 1 == 1)count++;
}
printf("count=%d\n", count);
}方法三:跟方法二思想一样,就是代码循环有些差别。int main(){int num = 13;int count = 0; while(num!=0) {if ((num & 1) == 1)count++;num = num >> 1;//按位与再右移一位} printf("count=%d\n", count);
}
方法四:num=num&(num-1),每执行一次就可以去掉num二进制序列中最右边的1.
优点:有几个1循环几次,效率高,平均时间复杂度高。
#include<stdio.h>#include<Windows.h>int main(){ int num = 13; int count = 0; while (num) { num = num&(num - 1);//去掉num二进制中最右边的1 //1101 num //1100 //1100 num count++; }//有几个1循环几次,时间效率高 printf("count=%d\n", count);system("pause");return 0;}
阅读全文
0 0
- 写一个函数返回参数二进制数中1的个数的几种方法
- 二进制数中返回1的个数的几种方法
- 返回二进制数中1的个数
- 返回一个参数中二进制数中1的个数
- 编写一个递归方法,返回数N的二进制表示中1的个数
- 编写一个递归方法,它返回数N的二进制表示中1的个数
- 编写一个递归方法,返回数N的二进制表示中1的个数
- C—返回一个数二进制中1的个数
- 返回二进制中1的个数
- 返回参数二进制中 1 的个数
- 返回参数二进制中 1 的个数
- 返回二进制中1的个数
- 求二进制数中1的个数
- 计算二进制数中1的个数
- 二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- Codeforces --- Mahmoud and Ehab and the MEX
- 深入了解PHP【生命周期】
- Item 11:在赋值操作符中处理自我赋值【effective C++读书笔记】
- VisualSVN Server v3.7
- Android 退出登录功能
- 二进制数中返回1的个数的几种方法
- Codeforce 862B Mahmoud and Ehab and the bipartiteness (二分图染色 + 链式前向星)
- 大整数的乘法
- Codeforces 862C
- 基于Spring session 和 redis 的session共享问题
- 自己动手简单实现CountDownLatch
- 如何在Android7.0系统下通过Intent安装apk
- windows下tomcat日志输出至文件
- Microservices From Design to Deployment(中文完整版)