面试题12:二进制中1的个数

来源:互联网 发布:仿链家系统源码模板 编辑:程序博客网 时间:2024/06/10 11:29
题目:

请实现一个函数,输入一个整数,输出该数二进制表示中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