算法学习记录九(C++)--->二进制中1的个数
2017-08-11 14:39
435 查看
描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析
这种位运算的题目面试中很容易遇到如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与(&)运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与(&)运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
代码
class Solution { public: int NumberOf1(int n) { int count = 0; // 二进制都为0的时候结束 while(n!=0){ count++; // 当前数字减去1之后,最有变的1变成0,而1右边的输全部变成0 // 再和当前数字进行&运算 两个位都为1时,结果才为1 // 因此每次进行一次&运算,就少掉一个1,最后统计count即可 n=n&(n-1); } return count; } };
相关文章推荐
- 算法学习记录三(C++)--->从尾到头打印链表每个节点的值
- 算法学习记录十一(C++)--->调整数组顺序使奇数前偶数后
- 算法学习记录四(C++)--->通过前序和中序序列重建二叉树
- 算法学习记录一(C++)--->二维数组中的查找
- 算法学习记录十(C++)--->数值的整数次方
- 算法学习记录五(C++)--->两个栈实现队列
- 算法学习记录十四(C++)--->二叉树的镜像
- 算法学习记录二(C++)--->字符串空格替换
- 算法学习记录七(C++)--->二分法找有序旋转数组最小值
- 算法学习记录十二(C++)--->链表题目集合
- 算法学习记录十三(C++)--->10年微软面试题树的子结构
- 算法学习记录八(C++)--->一句代码搞定变态跳台阶
- 算法学习记录六(C++)--->获取斐波那契数列第n项
- 在别的地方看的<<给程序员介绍一些C++开源库>>,记录给大家共同学习
- 14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录
- 在别的地方看的<<给程序员介绍一些C++开源库>>,记录给大家共同学习
- C++学习记录12--#include<iomanip>成员函数
- 算法学习 - 图的深度优先遍历(DFS) (C++)
- 学习->记录->积累
- [学习]C++ STL(自定义泛型算法)