面试题12:二进制中1的个数
来源:互联网 发布:仿链家系统源码模板 编辑:程序博客网 时间:2024/06/10 11:29
题目:
下面看一种更高效的方法,思路是将原数字减1,然后与原数据做与操作,这样可以把该整数最右边一个1变为0,其高位的数字没变。那么一个整数有多少个1,就可以进行多少次这样的操作。
第一步,将两数异或,第二步,统计异或后1的位数。
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
思路:
可以将数与0或,然后将该数右移,不断进行下去,知道变为0。
但是注意如果是负数,最后不管怎么移动,最高位补的都是1,进入死循环。
于是可以考虑将数与1与,然后将1左移1位,再进行与,直到这个数变为0。
时间复杂度:整数32位的话需要循环32次。
#include <iostream>#include <vector>#include <string>#include <stack>#include <algorithm>using namespace std;int oneNumber(long n){long temp = 1;int res = 0;while (temp){if (n & temp) ++res;temp=temp << 1;}return res;}int main(){cout << oneNumber(-5) << endl;return 0;}
下面看一种更高效的方法,思路是将原数字减1,然后与原数据做与操作,这样可以把该整数最右边一个1变为0,其高位的数字没变。那么一个整数有多少个1,就可以进行多少次这样的操作。
#include <iostream>#include <vector>#include <string>#include <stack>#include <algorithm>using namespace std;int oneNumber(long n){int res = 0;while (n){++res;n = n&(n - 1);}return res;}int main(){cout << oneNumber(-5) << endl;return 0;}
拓展:
1.用一条语句判断一个整数是不是2的整数次方。
return (n&(n - 1))? false:true;2.输入两个整数m和n,计算需要改变m的二进制中多少位才能得到n。
第一步,将两数异或,第二步,统计异或后1的位数。
注意:把一个数减去1后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变为0.
0 0
- 面试题---二进制中1的个数
- 面试题12:二进制中1的个数
- 面试题:二进制表示中1的个数。
- 面试题10:二进制中1的个数
- 面试题10:二进制中1的个数
- [剑指offer][面试题10]二进制中1的个数
- 【面试题十】二进制中1的个数
- 面试题十 二进制中1的个数
- 《剑指offer》面试题10二进制中1的个数
- 【剑指offer】面试题10:二进制中1的个数
- 【剑指offer】面试题10:二进制中1的个数
- 剑指offer 面试题10 二进制中1的个数
- 剑指Offer:面试题10 二进制中1的个数
- 面试题10 二进制中1的个数
- 面试题10:二进制中1的个数
- 面试题10-二进制中1的个数
- 面试题10:二进制中1的个数
- 面试题10二进制中1的个数
- Eclipse和PyDev构建Python开发环境
- Duplicate entry '1000094731-2' for key 'PRIMARY', Error_code: 1062;
- 文章标题
- 面向对象三大特征:继承、封装、多态 (泛型)
- 排序算法:堆排序
- 面试题12:二进制中1的个数
- woe和iv的含义
- Step-by-Step Guide to Setting Up an R-Hadoop System
- 64位Win7安装Oracle12C临时位置权限错误解决方案
- 【LEETCODE】204-Count Primes
- ZxingUtil二维码 封装
- SQL server学习笔记之数据库启动登陆,创建和维护
- UILabel
- MFC Ribbon界面各部分的名字