剑指 Offer 15. 二进制中 1 的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
题目分析。
简单的位运算,一种是逐位计算,看一眼就会,时间复杂度为O(log n),n是数字1最高位所在位数。另一种是利用 n&= n-1,这可以讲最低位的1置0,时间复杂度仅和1的个数相关。
法一:
class Solution {
public:
int hammingWeight(uint32_t n) {
unsigned int res = 0; // c++ 使用无符号数
while(n != 0) {
res += n & 1;
n >>= 1;
}
return res;
}
};
法二:
```cpp
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while(n != 0) {
res++;
n &= n - 1;
}
return res;
}
};
剑指 Offer 65. 不用加减乘除做加法
题目分析
简单来说就是将情况分为两种,一种是1+0的,这个可以用或运算,一种是1+1的要用与运算+左移一位。将这两种算法逐位进行,分别记录 ,最后在直接相加就好了。为了节省空间,将或出来的值可以赋给a,进位c赋给b,这样就可以不用定义一个全局变量了
class Solution {
public:
int add(int a, int b) {
while(b != 0)
{
int c = (unsigned int)(a & b) << 1; //计算进位
a ^= b; // 在第一轮循环中先计算本位,之后是在计算进位。
b = c;// 真正将进位放到正确的位置上,
}
return a;
}
};