二进制中1的个数
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
- 剑指offer中的二进制中1的个数问题
代码如下:
class Solution {
public:
int NumberOf1(int n) {
unsigned int test = 1;
int count = 0;
while (test){
if (n&test!=0){
count++;
}
test=test << 1;
}
return count;
}
};
输出一直是32,考虑原因int是32位的。测试的输出了每次n&test,结果是正确的,也就是说错误就在if里,突然就想到了运算符的优先级。一查表果然是!的优先级高于&。
学习C++的时候一直觉得这些东西根本就不用记,但是也很少练习,弄混了这些基本点出错的时候还是很浪费时间的。
一点点练习巩固吧~
附运算符优先级:
另上面的方法复杂度取决于所在系统int的位数。附复杂度等于二进制中1的个数的代码:
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while (n){
if (n&(n - 1))
count++;
n = n&(n - 1);
}
return count;
}
};
n&(n-1)的意义是:把一个整数减去1,再和原数作与运算得到的结果是将原数最右边的第一个1变成0,其他不变。(举例就可以发现该规律)