zoukankan      html  css  js  c++  java
  • 【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 }

    程序结果:

  • 相关阅读:
    HTML、CSS、JS 复习——序
    HTML + CSS短标题(二,三,四文字长度)两端对齐的方式
    Supper关键字
    java的重写
    java重载
    Java继承
    JAVA访问权限控制
    (转)java类初始化顺序
    Java 数组和集合
    Java 方法签名
  • 原文地址:https://www.cnblogs.com/zhangboy/p/6430360.html
Copyright © 2011-2022 走看看