位运算实现加法和减法——学习笔记

Leetcode 上看到一道很有意思的题,如何不用“+”和“-”来实现数字的加减运算

既然不能用“+”和“-”,那么只能用位运算来做了,毕竟追本朔源所有的运算都是由位运算实现的。

 

由于二进制每一位只有0和1两个状态,因此每一位只有四种可能的运算,分别是:

(1)0+0=0;

(2)1+0=1;

(3)0+1=1;

(4)1+1=0;

我们找找规律就能发现,其实就是对每一位进行了异或^操作

我们还可以发现只有运算(4)有了进位,由于只有当(1,1)时才有进位,我们可以用与&操作来保存进位。

因此,A+B可以先转化为A^B和A&B两个值,由于A&B是进位值,因此需要整体向前移动一位才算进位,如此一来就得到加法的第一步转化公式:

A+B=A^B+(A&B)<<1;

01+01=00+10;(二进制表示)

 

我们将^和&操作获得的值重新赋给A和B,利用公式不断将A+B进行转化,直到B=0也就是没有进位时加法才算完成了。如下:

(1)  A'=A^B;

      B'=(A&B)<<1;

(2)  A=A'

      B=B'

(3)  判断B是否为0,不为0则重新执行(1)

来看个具体的例子:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值