第48题——不用加减乘除做加法

160 阅读1分钟

题目:

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

思路:

101 ^ 111 = 0010 (没有处理进位的加法)

(101 & 111) << 1 = 101 << 1 = 1010 (此处得到哪一位需要加上进位,为1的地方表示有进位需要加上)

0010 ^ 1010 = 1000 (没有处理进位的加法 + 进位 = 没有处理进位的加法)

(0010 & 1010) << 1 = 0010 << 1 = 00100 (查看是否有新的进位需要处理)

1000 ^ 00100 (没有处理进位的加法 + 进位 = 没有处理进位的加法)

(1000 & 00100) << 1 = 00000 << 1 = 000000 (进位为0,所以没有要处理的进位了)

Java

package nowcoder;

public class S48_Add {
    //利用位运算
    public int add(int num1, int num2){
        while (num2 != 0){
            int tmp = num1 ^ num2;//除进位的结果
            num2 = (num1 & num2) << 1;//进位的结果
            num1 = tmp;
        }
        return num1;
    }
    public static void main(String[] args){
        S48_Add s48 = new S48_Add();
        System.out.println(s48.add(12, 14));
    }
}

Python

class Add:
    def Add(self, num1, num2):
        if not num1:
            return num2
        if not num2:
            return num1
        while num2 != 0:
            n1 = num1 ^ num2
            n2 = (num1 & num2) <<1
            num1 = n1 & 0xFFFFFFFF
            num2 = n2
        return n1 if num1 >> 31 == 0 else num1 - 4294967296
    
if __name__ == '__main__':
    test = Add()
    print(test.Add(12, 15))