目录
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;//返回异或最终结果
}