Python实现:用位运算符实现加法,不允许使用 “+”
程序员文章站
2022-04-10 23:46:33
...
计算两个整数a、b的和,但是不能使用“+”操作符。
即:给定a=1,b=2,返回结果3
位运算基础
1、位运算符
利用位运算实现加法,即计算机利用二进制进行运算,当然离不开位运算
2、异或运算
相同为0,不同为1
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
要实现加法,先考虑1位数的加法,不考虑进位,如下:
1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0
可知,上面的表达式可以用位运算符”^”代替,接下来考虑进位
3、与运算
都为1,则为1
上面的加法可以表示为:
0 & 0 = 不进位
1 & 0 = 不进位
0 & 1 = 不进位
1 & 1 = 进位
从上推到,可得:
位运算中,用“<<”表示向左移动一位,即“进位”,我么可以用以下表达式实现进位:
(x&y<<1
于是可以得到如下两个表达式:
x^y //执行加法
(x&y<<1 //进位操作
两位数的加法:
11+01=100 //实际的二进制算法
//推算表达式
11^01=10
11&01<<1 = 10
由于不能使用加法,接着按上述算法计算:
10^10 =00
(10&10)<<1=100
到此,就可以得出结论,总结如下定理:
定理一:设a,b位两个二进制数,则a+b=a^b+(a&b)<<1
证明: a^b是不考虑进位的加法结果,当二进制位同时为1时,才有进位,因此(a&b)<<1 是进位产生的值,称为进位补偿,将两者相加便是完整加法结果。
定理二:利用定理一可以实现只用位运算进行加法运算。
证明: 利用定理一中的等式不停对自身进行迭代,每迭代一次,进位补仓右边就多一位0,因此最多需要加数二进制位数长度次迭代,进为补偿就变为0,这时运算结束。
4、Python实现
#不使用“+”来求两个数的和
def newadd(a, b):
ta = a&b
tb = a^b
while(ta):
t_a = tb
t_b = ta<<1
ta = t_a & t_b
tb = t_a ^ t_b
print('a+b=', tb)
if __name__ == "__main__":
newadd(4,5)
'''
计算过程:
a = 100 //4
b = 101 //5
ta = 100 //4
tb = 001 //1
进入循环循环
t_a = 001
t_b = 1000 //8
ta = 0000 //0
tb = 1001 //9
退出循环'''
上一篇: restful api
下一篇: Josephu问题实现