【LeetCode371】 Sum of Two Integers

题目描述:

解题思路:

   此题是要在不用操作符+和-的情况下,求两个整数的和。既然不能用内置的加减法,那就只能用位运算(&, |, ~, ^)。

(1)异或(xor):异或的数学符号为“⊕”,计算机符号为“xor”。

  异或也叫半加运算,其运算法则相当于不带进位的二进制加法:异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(相同为0,不同为1),这些法则与加法是相同的,只是不带进位。  

  

输入
运算符
输入
结果
1
0
1
1
1
0
0
0
0
0
1
1

(2)与(&):与运算后值为1的位即需要进位的位置,用与运算和移位的方法实现进位。

第一个输入
第二个输入
输出结果
1
1
1
1
0
0
0
1
0
0
0
0

  所以,两个二进制整数 a 和 b,如果相加的过程中如果没有进位,那么 a+b=a⊕b,这里 ⊕ 表示异或。那么 a+b 的进位为多少呢,只有 1+1时才会出现进位。

所以 a+b 的进位可以表示为 2×(a & b),这里 & 表示两个数字的按位与运算。之所以要乘以 2,是因为要向上进一位(即左移一位)。

概括如下: 

已知实现两个整数相加,可以分为两个步骤:

第一:不带进位相加,用异或实现。

第二:用上面的结果加上进位,用与运算和移位实现。又因为相加不能用+实现,所以此一步的相加仍得用两步实现,以此类推。

57为例:

1)没有进位的加:异或

(2)进位:需要在从左边数第一、第三位进位,即carry=a&b=0101中为1的位,需要进位多少呢,需要将0101左移一位得1010,也就是十进制的10,即(a&b<<1=1010

所以最后结果是0010+1010

由于不能使用+,这里把0010当作a,把1010当作b,继续重复上面(1)(2)两个步骤,直到最后没有进位,异或的结果即为最终结果。

Java代码:

 1 public class LeetCode371 {
 2     public static void main(String[] args) {
 3         int a=5,b=5;
 4         System.out.println(a+"和"+b+"相加的结果是:"+new Solution().getSum(a, b));
 5         }
 6 }
 7 class Solution {
 8 public int getSum(int a, int b) {
 9         int value=a^b;//没有进位的相加
10         int carry=a&b;//进位
11         int value_new;
12         while(carry!=0){
13             carry=carry<<1;
14             value_new=carry^value;
15             carry=carry&value;
16             value=value_new;
17         }
18         return value;
19     }
20 }

程序结果:

原文地址:https://www.cnblogs.com/zhangboy/p/6430360.html