求二进制中1的个数(编程之美)
2016-03-20 20:41
218 查看
求二进制中1的个数:
解法一:O(logn)int solve(int data) { int cnt = 0; while(data){ if(data & 1) cnt ++; data = data >> 1; } return cnt; }
解法二:O(M) M为1的个数
int solve(int data) { int cnt = 0; while(data){ data &= data - 1; cnt ++; } return cnt; }
精髓 : v & (v - 1)
v & (v + 1) 可以去掉末尾的连续多个1(如果末尾没有1 则不用去掉)
扩展问题:
把A变成B需要改变多少位?
<=>先问题等价转化:A与B有多少位不同? 显然是先异或,然后数1的个数就好了。下面附一份代码吧。
int solve(int a, int b) { int cnt = 0, data = a ^ b; while(data){ data &= data - 1; cnt ++; } return cnt; }
相关文章推荐
- python中的string模块
- java io
- C++实现获取某一类型最大值
- Spring中Quartz调度器的使用
- Java命名规则
- C#关于委托
- jdk环境变量配置
- 如何使用 Java8 实现观察者模式
- thinkphp- 许愿墙-1
- 遗传算法入门到掌握
- (C语言打印图形题2)编程,输入n,输出如下例(n=6)所示的图形:
- 《CLR Via C#》Visual Studio编译之后的.pdb文件
- kd-tree in Python
- Spring security oauth2最简单入门环境搭建--二、干货
- C和汇编混合编程
- Java编程中使用lambda表达式的奇技淫巧
- C#学习 - vs调试(采用异常处理来实现两个整数的和)
- 自动化测试,javasript遍历JSON对象及XML对象
- 1.python算法之汉诺塔
- 关于squirrel语言与C++的自动绑定问题(2)