另类加法

来源:互联网 发布:网络协议七层模型 编辑:程序博客网 时间:2024/04/27 22:04

如果让我们实现两个整数相加,但是不允许用加号及其它算数运算符,应该怎么实现呢,不能用算数运算,那其实还有一种运算方式就是位运算,关于算数运算大家可以看下位运算简单介绍,那么到底怎样用位运算实现呢,,,其实用两种运算符就可以了,"&" 和 "^"。数据在计算机中都是以二进制的形式来存储的,所以对于没有进位的运算,比如1+2,其实就是这样的

这就相当于异或,所以对于两个整数数a, b如果没有产生进位,我们可以用直接用 ^ 来实现,那么如果产生进位该怎么处理呢,这就要用到 & 运算符了。其实两个数相加我们可以看成是先把每一位上的数进行相加(产生的进位先保留着,不直接算到结果中),然后用加完的数值再加上产生进位的值的大小就是最终的大小,对于产生的进位,我们可以用&来计算。这样我们来看一个例子,3+3;

首先计算两个数相加后每一位上的数值(不包括进位,其实就是异或运算),是这样的


结果是0,然后再计算产生的进位大小(即就是与运算),是这样的


结果是3,也就是说在计算的过程中产生了三个进位,而每一个进位的大小是2(二进制),所以由于进位产生的大小就是3 * 2 = 6;再加上上一步没有进位的值0,所以结果就是6 + 0 = 6;这样我们的整个过程就结束了。然后看一下用代码怎么实现

import java.util.Scanner;/** * Created by zmt on 2016/12/25. */public class Test {    private static int a;    private static int b;    public static void main(String [] args){        Scanner sc = new Scanner(System.in);        a = sc.nextInt();        b = sc.nextInt();        System.out.println(addWithoutPlus(a, b));    }    private static int addWithoutPlus(int a, int b){        int temp;        do{            temp = a & b;            a = a ^ b;            b = temp << 1;        }        while(b != 0);        return a;    }}
如果理解了前面的过程描述,代码业界很好理解了,只要就看do while这一块,首先与运算保存两个数产生的进位的个数,然后再异或得到每一位上的数值运算大小,接着给进位的个数右移一位,也就是乘以二,判断进位是否为零,不为零继续用上一步的结果a加上产生的进位,同时得出新的进位个数,直到进位个数为零,即不产生进位,跳出循环。通过与和异或这两种运算符巧妙的实现了两个数的相加过程。核心代码只有三行,但是理解起来并不容易,但是通过整个实现过程去理解代码还是比较容易的。

最后,,,Merry Christmas ! ! ! ! ! !

0 0
原创粉丝点击