寻找一个整数二进制表示中1的个数
2014-04-14 20:14
239 查看
最基本的做法是不断的除以2,直到结果为0,这里做除法是一个比较耗时的操作。这里给出一个比较快速的算法(核心思想:去掉最低位的1):
代码1:
a不断地与自己的相反数-a按位相与(-a相当于a按位取反后加1),相当于排除最右边的1,然后直到该数变为0:
代码2:
a不断地与(a - 1)按位相与,直至为0:
代码1:
a不断地与自己的相反数-a按位相与(-a相当于a按位取反后加1),相当于排除最右边的1,然后直到该数变为0:
#include<stdio.h> int main() { int a, b; int count = 0; scanf("%d", &a); while(a) { count++; b = a & (-a);//最低位的1 a -= b; // 去掉了最低位的1 } printf("%d\n", count); }
代码2:
a不断地与(a - 1)按位相与,直至为0:
#include<stdio.h> int main() { int a, b; int count = 0; scanf("%d", &a); while(a) { count++; a &= (a -1); //去掉最低位的1 } printf("%d\n", count); }
相关文章推荐
- 杭电acm 1038题
- Linux下MySQL备份以及crontab定时备份
- Linux下MySQL备份以及crontab定时备份
- 初次使用boost 库
- Linux下MySQL备份以及crontab定时备份
- C# 心得
- nyoj17
- 在VS2010下如何使用头文件unistd.h
- ListBox 绑定之-SelectedItem
- Twitter.com在用哪些Javascript框架?
- C++中抽象类和接口类的区别
- Java中文件路径及其访问
- Android四大基本组件介绍与生命周期
- 【java】代理、包装
- 反转单词顺序
- Android Stagefright MPEG4Writer分析
- mysql的一些命令
- [转] 每个程序员都必须遵守的编程原则
- C#反射 入门学习 01
- Java 判断线程池 执行完毕