15题目描述:

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。

解析:

1.初始化数量统计变量count;
2.循环消去最右边的1:当n=0时跳出;
n &= n - 1:消去数字最右边的1;
count++:统计变量加1;
3.最后返回统计数量count。

Java:

public class Solution {
    public int hammingWeight(int n) {
        int count = 0;
        while(n != 0) {
            n = n & (n - 1);
            count++;
        }
        return count;
    }
}

JavaScript:

var hammingWeight = function(n) {
    let count = 0;
    while(n !== 0) {
        n = n & (n - 1);
        count++;
    }
    return count;
};

65题目描述:

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

解析:

1.无进位和n与进位c的计算公式如下:
n = a ^ b 非进位和: 异或运算
c = (a & b) << 1 进位: 与运算+左移一位
2.因为 (和s) = (非进位和n) + (进位c) ,所以即可将 s = a + b 转化为 s = n + c ,即 s = a ^ b + (a & b) << 1
3.采用递归思想: 虽然s = a + b = n + c,但是n + c还是用了'+',因此我们对n + c再次采用这种运算 (也就是把n当成a,c当成b,继续做a+b运算。看似无限循环,但是进位c总会有等于0的时候,此时结果就等于n)
4.非递归同理,循环求n和c,直至进位c = 0; 此时s = n, 返回n即可。

Java:

class Solution {
    public int add(int a, int b) {
        if(b == 0) {
            return a;
        }
        int c = a ^ b;
        int d = (a & b) << 1;
        return add(c, d);
    }
}

JavaScript:

var add = function(a, b) {
    if(b == 0) {
        return a;
    }
    let c = a ^ b;
    let d = (a & b) << 1;
    return add(c, d);
};