题目描述:

解题思路:

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

(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,是因为要向上进一位(即左移一位)。

概括如下: 

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

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

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

以5加7为例:

(1)没有进位的加:异或

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

所以最后结果是0010+1010。

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

Java代码:

 public class LeetCode371 {
public static void main(String[] args) {
int a=5,b=5;
System.out.println(a+"和"+b+"相加的结果是:"+new Solution().getSum(a, b));
}
}
class Solution {
public int getSum(int a, int b) {
int value=a^b;//没有进位的相加
int carry=a&b;//进位
int value_new;
while(carry!=0){
carry=carry<<1;
value_new=carry^value;
carry=carry&value;
value=value_new;
}
return value;
}
}

程序结果:

【LeetCode371】 Sum of Two Integers的更多相关文章

  1. 【LeetCode】Sum of Two Integers

    问题描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and - ...

  2. 【leetcode74】Sum of Two Integers(不用+,-求两数之和)

    题目描述: 不用+,-求两个数的和 原文描述: Calculate the sum of two integers a and b, but you are not allowed to use th ...

  3. 【BZOJ3944】Sum(杜教筛)

    [BZOJ3944]Sum(杜教筛) 题面 求\[\sum_{i=1}^n\mu(i)和\sum_{i=1}^n\phi(i)\] 范围:\(n<2^{31}\) 令\[S(n)=\sum_{i ...

  4. 【CF914G】Sum the Fibonacci 快速??变换模板

    [CF914G]Sum the Fibonacci 题解:给你一个长度为n的数组s.定义五元组(a,b,c,d,e)是合法的当且仅当: 1. $1\le a,b,c,d,e\le n$2. $(s_a ...

  5. 【BZOJ4262】Sum 单调栈+线段树

    [BZOJ4262]Sum Description Input 第一行一个数 t,表示询问组数. 第一行一个数 t,表示询问组数. 接下来 t 行,每行四个数 l_1, r_1, l_2, r_2. ...

  6. 【POJ1707】【伯努利数】Sum of powers

    Description A young schoolboy would like to calculate the sum for some fixed natural k and different ...

  7. 【Leetcode 371】Sum of Two Integers

    问题描述:不使用+是或-操作符进行整数的加法运算 int getSum(int a, int b); 我的思路:把整数化成二进制进行运算,注意类型是int,也就是要考虑负数.关于负数的二进制表示可见之 ...

  8. 【loj6059】Sum

    Portal --> loj6059 Solution ​​ 看过去第一反应是..大力数位dp!然后看了一眼数据范围... ​ 但是这没有什么关系!注意到我们不需要考虑前导零了,可以直接快乐dp ...

  9. 【leetcode】Sum Root to Leaf Numbers(hard)

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

随机推荐

  1. python简单验证码

    安装图片处理模块pillow :   pip install pillow pillow官网:http://pillow.readthedocs.io/en/latest/ 在views.py添加视图 ...

  2. 无法在类...中找到资源".bmp"

    在WinForm中写的一个程序,在项目中添加了一个bmp图片,然后 public void SetSubType(int SubType) { m_subType = SubType; switch ...

  3. SwipeRefreshLayout的高度测量

    感谢此作者的分享 http://www.cnblogs.com/linjzong/p/5221604.html 若SwipeRefreshLayout的子布局为一个线性布局LinearLayout, ...

  4. Android Toast:是一个类,主要管理消息的提示

    Toast:是一个类,主要管理消息的提示.makeText(),是Toast的一个方法,用来显示信息,分别有三个参数.第一个参数:this,是上下文参数,指当前页面显示第二个参数:“string st ...

  5. 报表导出excel方式介绍

     报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...

  6. 如何使用 adb 命令实现自动化测试

    如何使用 adb 命令实现自动化测试 一.前提: 1.打开手机调试模式,确保手机已正常连接电脑,可在电脑上通过adb devices命令查看,结果如下说明连接成功: List of devices a ...

  7. java 标准输出流、标准错误输出流、标准输入流及扫描仪

    初步认识标准输出流.错误输出流.输入流.扫描仪 package com.mydemo.controller; import java.util.Scanner; public class HelloW ...

  8. 风险管理,未雨绸缪——《代码之殇》读书笔记II

    这次的内容主要是关于软件开发过程中的风险管理,包括项目用时估计.产品的发布与更新.承诺兑现的重要性. ①项目用时估计 有人会质疑项目用时估计的可靠性,因为就事而言,这次的任务可能和上次不一样了,开发环 ...

  9. 对JDBC的轻量级封装,Hibernate框架

    IDEA是真的好用... 用脑子下jar包..http://mvnrepository.com/

  10. 在 Azure 中的 Linux VM 上创建 MongoDB、Express、AngularJS 和 Node.js (MEAN) 堆栈

    本教程介绍如何在 Azure 中的 Linux VM 上实现 MongoDB.Express.AngularJS 和 Node.js (MEAN) 堆栈. 通过创建的 MEAN 堆栈,可以在数据库中添 ...