不使用四则运算来求解两个数的和详解

目录

1.思路

2.求解例子

3.代码显示


1.思路

在进行求解之前,首先想到可以通过位运算来进行解决这个问题,位运算是对二进制数进行操作来进行求解,这是因为之前在学习位运算之前想到了^(异或)操作,因为异或操作有加法的功效,但是只使用异或可以进行求解吗?下面来进行详细说明:

2.求解例子

例如:求解一个 1和2异或,首先将这两个数转化为二进制数

1--->0000 0000 0000 0000 0000 0000 0000 0001

2--->0000 0000 0000 0000 0000 0000 0000 0010

1^2  0000 0000 0000 0000 0000 0000 0000 0011------>结果为:3

表面看只有^(异或)操作就可以解决这个问题,那是因为这里的两个二进制数没有进位,要是涉及到进位后,只异或是不能进行求解的。

例如:求解3和5的异或,将两个数转化为二进制数

3--->0000 0000 0000 0000 0000 0000 0000 0011

5--->0000 0000 0000 0000 0000 0000 0000 0101

3^5  0000 0000 0000 0000 0000 0000 0000 0110---->结果为6

显然与3+5的结果不相等,那是因为当有两位都为1时就应该进位,而直接异或就会忽略了进位,为了解决这个问题我们需要将进位后的结果求出,这是就会想到&(与)操作可以将相同位置都为1的位置都统计出来,接下来我们就使用&和^来进行求解3和5求和之后的结果。

&操作相当于判断是否进位,&操作相当于是将进位后的结果进行相加,所以这是一个累加的结果,每进一位就要相加一次,判断最后不需要进位就结束异或操作,下面为了看起来比较简单,就将3和5的二进制数只写4位来进行表示:

3--->0011        

5--->0101

首先3&5判断是否等于0,要是为0那么就认为没有进位,就不需要进位操作,否则就需要进位操作

(1)3&5--->0001                    3^5---->0110                0001<<1  

(2) 0010&0110--->0010       0010^0110--->0100     0010<<1  

(3)0100&0100--->0100         0100^0100--->0000   0100<<1

(4)1000&0000--->0000        1000^0000--->1000        结果为8

这里当与运算结果为0时该进位就结束,最后异或结果为两个数的和,综上,对于所有两个数求和都是这样进行计算。

3.代码显示

最终代码结果如下:

    //不使用加减乘除来计算加法的求和方法
    public static int Add(int n1,int n2){
       int tmp =0;
       do {
           tmp = (n1&n2)<<1;//进位操作
           n1 = n1^n2;//求和操作
           n2=tmp;
       }while (tmp!=0);//当进位没有结束,循环
       return n1;//返回异或最终结果
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值