<reponame>dingchaofan/AlgorithmSolution
# 48. 不用加减乘除做加法
# 写一个函数，求两个整数之和，要求在函数体内不得使用+、-、*、/四则运算符号。


# 由于题目要求不能使用四则运算，那么就需要考虑使用位运算
# 两个数相加可以看成两个数的每个位先相加，但不进位，然后在加上进位的数值
# 如12+8可以看成1+0=1 2+8=0，由于2+8有进位，所以结果就是10+10=20
# 二进制中可以表示为1000+1100 先每个位置相加不进位，
# 则0+0=0 0+1=1 1+0=1 1+1=0这个就是按位异或运算
# 对于1+1出现进位，我们可以使用按位与运算然后在将结果左移一位
# 最后将上面两步的结果相加，相加的时候依然要考虑进位的情况，直到不产生进位
# 注意python没有无符号右移操作，所以需要越界检查
# 按位与运算：相同位的两个数字都为1，则为1；若有一个不为1，则为0。
# 按位异或运算：相同位不同则为1，相同则为0。

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        # 在Python中，由于负数使用补码表示的，
        # 对于负数，最高位为1，而负数在计算机是以补码存在的，
        # 往右移，符号位不变，符号位1往右移，最终可能会出现全1的情况，导致死循环。
        # 与0xffffffff相与，就可以消除负数的影响。
        MAX = 0x7FFFFFFF
        MIN = 0x80000000
        mask = 0xFFFFFFFF
        while(num2):
            temp = (num1^num2) & mask
            num2 = ((num1&num2)<<1) & mask
            num1 = temp
        # python没有无符号右移操作，所以需要越界检查
        return num1 if(num1<=0x7FFFFFFF) else ~(num1^0xFFFFFFFF)



# 48. 不用加减乘除做加法
# 写一个函数，求两个整数之和，要求在函数体内不得使用+、-、*、/四则运算符号。


# 由于题目要求不能使用四则运算，那么就需要考虑使用位运算
# 两个数相加可以看成两个数的每个位先相加，但不进位，然后在加上进位的数值
# 如12+8可以看成1+0=1 2+8=0，由于2+8有进位，所以结果就是10+10=20
# 二进制中可以表示为1000+1100 先每个位置相加不进位，
# 则0+0=0 0+1=1 1+0=1 1+1=0这个就是按位异或运算
# 对于1+1出现进位，我们可以使用按位与运算然后在将结果左移一位
# 最后将上面两步的结果相加，相加的时候依然要考虑进位的情况，直到不产生进位
# 注意python没有无符号右移操作，所以需要越界检查
# 按位与运算：相同位的两个数字都为1，则为1；若有一个不为1，则为0。
# 按位异或运算：相同位不同则为1，相同则为0。

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        # 在Python中，由于负数使用补码表示的，
        # 对于负数，最高位为1，而负数在计算机是以补码存在的，
        # 往右移，符号位不变，符号位1往右移，最终可能会出现全1的情况，导致死循环。
        # 与0xffffffff相与，就可以消除负数的影响。
        MAX = 0x7FFFFFFF
        MIN = 0x80000000
        mask = 0xFFFFFFFF
        while(num2):
            temp = (num1^num2) & mask
            num2 = ((num1&num2)<<1) & mask
            num1 = temp
        # python没有无符号右移操作，所以需要越界检查
        return num1 if(num1<=0x7FFFFFFF) else ~(num1^0xFFFFFFFF)
# 48. 不用加减乘除做加法 # 写一个函数，求两个整数之和，要求在函数体内不得使用+、-、*、/四则运算符号。 # 由于题目要求不能使用四则运算，那么就需要考虑使用位运算 # 两个数相加可以看成两个数的每个位先相加，但不进位，然后在加上进位的数值 # 如12+8可以看成1+0=1 2+8=0，由于2+8有进位，所以结果就是10+10=20 # 二进制中可以表示为1000+1100 先每个位置相加不进位， # 则0+0=0 0+1=1 1+0=1 1+1=0这个就是按位异或运算 # 对于1+1出现进位，我们可以使用按位与运算然后在将结果左移一位 # 最后将上面两步的结果相加，相加的时候依然要考虑进位的情况，直到不产生进位 # 注意python没有无符号右移操作，所以需要越界检查 # 按位与运算：相同位的两个数字都为1，则为1；若有一个不为1，则为0。 # 按位异或运算：相同位不同则为1，相同则为0。 # -*- coding:utf-8 -*- # write code here # 在Python中，由于负数使用补码表示的， # 对于负数，最高位为1，而负数在计算机是以补码存在的， # 往右移，符号位不变，符号位1往右移，最终可能会出现全1的情况，导致死循环。 # 与0xffffffff相与，就可以消除负数的影响。 # python没有无符号右移操作，所以需要越界检查