【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,是因为要向上进一位(即左移一位)。
概括如下:
已知实现两个整数相加,可以分为两个步骤:
第一:不带进位相加,用异或实现。
第二:用上面的结果加上进位,用与运算和移位实现。又因为相加不能用+实现,所以此一步的相加仍得用两步实现,以此类推。
以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的更多相关文章
- 【LeetCode】Sum of Two Integers
问题描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and - ...
- 【leetcode74】Sum of Two Integers(不用+,-求两数之和)
题目描述: 不用+,-求两个数的和 原文描述: Calculate the sum of two integers a and b, but you are not allowed to use th ...
- 【BZOJ3944】Sum(杜教筛)
[BZOJ3944]Sum(杜教筛) 题面 求\[\sum_{i=1}^n\mu(i)和\sum_{i=1}^n\phi(i)\] 范围:\(n<2^{31}\) 令\[S(n)=\sum_{i ...
- 【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 ...
- 【BZOJ4262】Sum 单调栈+线段树
[BZOJ4262]Sum Description Input 第一行一个数 t,表示询问组数. 第一行一个数 t,表示询问组数. 接下来 t 行,每行四个数 l_1, r_1, l_2, r_2. ...
- 【POJ1707】【伯努利数】Sum of powers
Description A young schoolboy would like to calculate the sum for some fixed natural k and different ...
- 【Leetcode 371】Sum of Two Integers
问题描述:不使用+是或-操作符进行整数的加法运算 int getSum(int a, int b); 我的思路:把整数化成二进制进行运算,注意类型是int,也就是要考虑负数.关于负数的二进制表示可见之 ...
- 【loj6059】Sum
Portal --> loj6059 Solution 看过去第一反应是..大力数位dp!然后看了一眼数据范围... 但是这没有什么关系!注意到我们不需要考虑前导零了,可以直接快乐dp ...
- 【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 ...
随机推荐
- arcgis 加载高德地图 es6的方式
目前很多arcgis 加载高德地图是dojo的方式 外部引入文件,现在改成这种方式 /** * Created by Administrator on 2018/5/14 0014. */ impor ...
- js匹配日期和时间的正则表达式
自己写比较头疼,copy下来留着以后用 //日期的正则表达式 -]\d{}-([-]|[-])-([-]|[-][-]|[-])$/; var regExp = new RegExp(reg); if ...
- ReactNative应用<DCL每日查看>开发总结
App效果: 功能和交互简单描述: 针对微信使用用户每天的零碎时间来进行天气,新闻要点等查看,免去了打开其他App来查看; 针对每一天可以设置一项重要任务计划,可开启通知提醒,让每一天任务简化,免去太 ...
- 结对编程——四则运算器(UI第十组)
博客目录: 一.问题描述 二.设计思路 三.UI开发过程 四.对接过程 ...
- 切片和append操作
本文转自:http://meia.fun/article/1541470004286 学习切片时,被append这个方法困扰了半天:在main方法中把一个切片作为实参传递给另一个函数,并在这个函数内调 ...
- mysql group replication观点及实践
一:个人看法 Mysql Group Replication 随着5.7发布3年了.作为技术爱好者.mgr 是继 oracle database rac 之后. 又一个“真正” 的群集,怎么做到“ ...
- 探究MySQL MGR的读写分离
1:现有环境 机器 MySQL 环境 172.16.128.240 MGR NODE1 MGR 172.16.128.241 MGR NODE2 MGR 172.16.128.242 MGR NODE ...
- java:通过Calendar类正确计算两日期之间的间隔
在开发Android应用时偶然需要用到一个提示用户已用天数的功能,从实现上来看无非就是持久化存入用户第一次使用应用的时间firstTime(通过SharedPreferences .xml.sqlit ...
- 安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法
很多人在安装orcl数据库时,出现很多报错,我也不例外,因上次数据库出现问题,无法修复,只能从新安装,无奈的是,安装时报启动服务出现错误,找不到OracleMTSRecoveryService错MMP ...
- windows下npm安装vue
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...