【转载】不用加号和减号计算两个数的加法
原文地址:https://www.namidame.tech/calculate-plus-without-plus-sign.html
1. 问题描述
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-without-plus-lcci
2. 问题分析
一般这种不准使用原先的符号来解决的问题都是考察对功能实现原理的了解,而加法在计算机中的实现其实就是数字电路课程中学习过的加法器的实现。对于数字电路,加法器是由基本的位相与、位异或组合实现的,下面来看一下一个例子
1101
+ 0101
= 1000
二进制数1101和0101相加,若不考虑进位,只做无进位的加法,则结果是1000
再来看看两个数按位异或的真值表
a | b | a^b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
可以观察到,按位异或的结果与无进位加法的结果相同,实际上,加法器的无进位加法就是用位异或实现的。
实现了无进位加法,再来看进位问题如何解决,如果用0和1分别表示该位相加后无进位和有进位,那么结果如下
11010101
进位 0101
但是进位后的值是要加到高一位上的,所以进位结果0101只要左移1位再与无进位加法的结果相加即可得到最终的加法结果。那么怎么得出进位这个数呢?再来看看两个数按位相与的真值表
a | b | a&b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
可以发现,按位相与的结果就是进位的值0101,于是我们可以用位相与操作来得出进位值。
下面来介绍两种实现方法。
3. 循环结构实现
# include <iostream>
using namespace std;
int add(int a, int b) {while(b != 0){unsigned int jinwei = (unsigned int)(a & b) << 1;a = a ^ b;b = jinwei;}return a;
}int main()
{cout << add(-1, 2) << endl; // 1
}
在计算位相与的时候要转化为无符号整形数,否则在某些编译器上可能禁止左移一个负数。
在第一次循环时,先得出进位的值,然后将初始的两个数ab按位异或实现相加,将jinwei赋给b后,第二次循环开始就是计算进位值和总和的相加。由于加上进位值之后还有可能出现进位,于是当进位值为0之后即计算完毕。
4. 递归结构实现
# include <iostream>
using namespace std;
int add(int a, int b) {auto jinwei = (unsigned int)(a & b) << 1;int sum = (int)(a ^ b);if(jinwei == 0){return sum;}return add(sum, jinwei);
}int main()
{cout << add(-1, 2) << endl;
}
通过上面分析可以知道,在计算出进位值之后也是要加到总和上的,等于不断调用加法,于是可以考虑用尾递归来实现。代码中将sum和jinwei不断代入add函数,直到进位值为0即计算完毕。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者: 你很德布罗意
邮箱: namidame@sina.cn
博客地址: https://www.namidame.tech/
原文地址: http://www.namidame.tech/calculate-plus-without-plus-sign.html
【转载】不用加号和减号计算两个数的加法相关推荐
- 【LeetCode击败99%+】不使用加号和减号计算两整数之和
题目 不使用运算符 + 和 - ,计算两整数 a .b 之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, ...
- 牛客网题目——不用四则运算符号,计算两个数字的和
牛客网题目--不用四则运算符号,计算两个数字的和 这道题的关键在于理解二进制如何执行两个数的加和操作. 二进制每位相加就相当于各位做异或操作:因此解法大致可以分为两步: 第一步:相加各位的值(下一步再 ...
- python求两数之和的命令_python计算两个数的百分比方法
工作中遇到了要计算两个数百分比的问题,python 2.7 环境. 代码: #!/usr/bin/env python #function: 计算百分比 #USAGE: python calculat ...
- python计算两个数的最大公约数和最小公倍数
文章目录 计算最大公约数(暴力求解和辗转相除法) 计算最小公倍数 计算最大公约数(暴力求解和辗转相除法) 方法一:暴力求解 def hcf(x,y):smaller = x if x<y els ...
- python怎么计算百分比_python计算两个数的百分比方法
工作中遇到了要计算两个数百分比的问题,python 2.7 环境. 代码: #!/usr/bin/env python #function: 计算百分比 #USAGE: python calculat ...
- 计算两个数之差的绝对值
程序: #include <stdio.h>//从键盘输入两个整数 ,调用库函数 计算两个数之差的绝对值 //带符号相减int SBB(int a,int b) {int S = 0;S ...
- 计算两个数平均值的三种方法
第一种方法: 思路:两数相加求和再除2 代码 int a=10;int b=20;int avg=0;avg=(a+b)/2;//平局值//或者avg=(a+b)>>1://右移表示除2, ...
- 不使用加法计算两个数的和
一.前置知识 为了能够快速的理解最后的算法,这里先准备一些前置知识.这些所谓的前置知识可以理解为"点",最后只要把这些"点"串联为"线",就 ...
- 编写一个函数,实现计算两个数大小的比较,且返回最大值。
例子:编写一个函数,实现计算两个数大小的比较,且返回最大值. 解释:当$a大于$b,返回最大值$a,当$b大于$b,返回最大值$b,否则输出null 实现效果: ...
最新文章
- ajax实现简单计算器,一个简单的jQuery计算器实现了连续计算功能
- faster-rcnn中添加Mask中的RoiAlign层,使回归框更精确( roi_align_layer.cu:240] Check failed: error == cudaSuccess *)
- App设计灵感之十二组精美的地图导航App设计案例
- [html] 跨标签页的通讯方式有哪些
- java中流_java 中流的使用
- IDF 实验室 初探乾坤
- SuperPro 3000U 编程器电源部分
- Java求出1000内的完数
- android 打地鼠,Android实现打地鼠小游戏
- window10安装vnc无法使用,window10安装vnc无法使用的原因和解决办法
- 我爬取了淘宝零食库,画了一个全国零食地图
- 马云收购恒生电子几大关键问题
- 基于Pytorch实现自建数据库的深度神经网络模型案例
- bzoj3926 诸神眷顾的幻想乡 后缀自动机
- UART总线协议——esp32学习笔记
- 全文检索语句中的AND和OR的用法
- Android系统各个版本系统特性整理(1.1-6.0)
- Jenkins修改端口号
- 无监督学习-案例分析:利率期限结构
- 2021年中国智能驾驶行业研究报告
热门文章
- matlab 雅各比符号,密码学与编码理论(第2版)(密码学方面的经典著作)
- 计算机网络码片序列计算问题
- 代码角度理解SGX的认证机制(一):本地认证
- FTP指的是什么协议?由什么组成?有什么作用?
- 张雨潇 计算机科学,三亚考生本科第二批录取名单[一]
- Citavi导入中国知网caj文件
- [HDSC] 华大Cortex-M离线烧录器(CM PGM)HCTL-1A使用方法记录
- 自然语言处理之新手上路
- Echarts( Pie,Bar)数据可视化 条形图,柱图,饼图、时间轴代码 JS-NEW
- JAVA网课|字符串