剑指offer_11_二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
#include <iostream>
using namespace std;
class Solution1 {//递归实现
public:
int NumberOf1(int n) {
unsigned int us_n = n;
if (n == 0)return 0;
return(us_n & 1) + NumberOf1(us_n >> 1);
}
};
class Solution {//依次遍历
public:
int NumberOf1(int n) {
unsigned int us_n = n;
int sum = 0;
while (us_n != 0)
{
if (us_n & 1)sum++;
us_n = us_n >> 1;
}
return sum;
}
};
int main()
{
Solution1 mys;
cout << mys.NumberOf1(-219);
cout << "end" << endl;
system("pause");
}
最优解法如下:
总结:
1.c++判断一个数的奇偶性,n%2和n&1是一样的作用,但是n&1要快。
2.带符号的数和无符号的数C++会做不同处理,如果你想得到无符号移位,先将表达式
强制转换为无符号类型,然后再移位(汇编中移位也有算数移位和逻辑移位两种指令)
3.对于一个x个bit的数,普通遍历每一位的解法要遍历约x次,最优解循环的次数只需
要遍历1的个数次,通过n=n&(n-1),每次可很高效地将数(二进制形式)最右端的1置
为0。