【题解】Leetcode.371. Sum of Two Integers

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example: Given a = 1 and b = 2, return 3.

题目大意:
不使用+和-操作符计算两int和

思路:
位操作模拟2进制运算

实现:

// 实现 a
// 从最右边的位开始一位一位地相加进位
int getSum(int a, int b) {
    int r = 0;
    unsigned int t = a|b;
    for(int i = 1;t;i<<=1){
        r|=(i&(a^b)&r)<<1; //r的第i位为1且a^b的第i位为1时进位
        r^=(i&(a^b));      //计算r的第i位
        r|=(i&a&b)<<1;     //a&b的第i位为1时进位
        t>>=1;
    }
    return r;
}
// 实现 b
// 不断左移异或保留为1的位直到没有位需要进位
// 相比上一种方法,这里是多位同时进位
int getSum(int a, int b) {
    int r = b;
    for(;a;b=r){
        r^=a;
        a=(a&b)<<1;
    }
    return r;
}
// 实现 c
// 原理同上一种方法,写成递归形式
int getSum(int a, int b) {
    return a?getSum((a&b)<<1,b^a):b;
}

方法 b 解释:
3+7和123+234的计算过程
这里写图片描述

// 使用这个程序手动输入a,b以获取更多例子
// 输出每次循环后的r,a,b的二进制
#include <stdio.h>
void pbit(int x,int k){if (k) pbit(x>>1,k-1),printf("%d", x & 1);}
int getSum(int a, int b) {
    int t = 1;
    int r = b;
    for (; a; ){
        r ^= a;
        a = (a&b) << 1;
        b = r;
        printf("loop %d:\n", t++);
        printf("r: "); pbit(r, sizeof(int) * 8); puts("");
        printf("a: "); pbit(a, sizeof(int) * 8); puts("");
        printf("b: "); pbit(a, sizeof(int) * 8); puts("");
    }
    return r;
}
int main(void){
    for (;;){
        int a, b;
        scanf("%d%d", &a, &b);
        printf("sum:%d\n", getSum(a, b));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/c_duoduo/article/details/52068305
今日推荐