计算两个数之和,本来是一件小学生就会做的事,不对,幼儿园学生都会!可是偏偏有些面试官,要求计算两个数之和不能用加号“+”,这不是故意刁难人嘛。可是为了offer,还是得硬着头皮去做。今天就谈一谈怎么在不使用四则运算符号的前提下做加法。
虽然我们人做四则运算喜欢使用算术运算符,可是计算机呢?对计算机而言,一切皆是一串二进制的数。
既然是二进制数,每个bit就可以通过:& (与)、^(异或)、<<(移位)等进行运算。
最简单的集中情况:

于是,聪明的你很快就能想到(想不到也没办法~)上面的加法不证实异或运算的结果吗?
因为:0 ^ 0=0 ,0 ^ 1=1,1 ^ 1=0
所以,计算两个数a、b之和,直接用a^b就能得到在不考虑进位情况下的和。但是既然是加法,不考虑进位好像还是不太好,如何考虑进位呢?
先来做一下,我们最熟悉的十进制加法运算:

从上面可以看出来,两个数之和=两数之和(不考进位)+进位数 (为了方便描述将1 以及0101成为进位数)
如果进位发生在个位,进位在十位
如果进位发生在十位,进位在百位……
一次类推,因此需要将进位数乘以10,从位运算的角度,就是将进位数左移1位
明白了10进制运算的原理,二进制也是一样

由于进位发生在最左边1为,但是进位在左边第2为,因此要将进位数左移1位后相加。
1100+(0010<<1) = 1110

通过上面的分析,可以得出如下结论:
两个数相加的和,等于两个数异或结果加上进位数左移1位后的结果

但是在实际计算的时候,由于两个数异或的结果加上进位数左移1位的结果,还是会产生新的进位,所以需要做反复的进位计算,直到最后进位数为0。

那么问题来了?最后进位数一定会为0吗?什么时候会为0。答案是肯定的!
例如0101+1001,计算过程如下:
第一次计算:0101+1001=1100 进位为0001(左移移位为00010
第二次计算:1100+00010=1110 进位为0
第一次计算是,最左边1位会产生进位。
第二次计算时,由进位数会左移1位,因此最左边的数一定0,计算时不会产生进位。因此,每计算一次,就可以让从左到到至少减少1位不会进位,最终进位数会变为0。

最后附上代码(假定结果不会溢出):

int add(int a,int b)
{int sum=a;while(b){int carry=sum&b;//获取进位的各个bitsum^=b;//计算sum+b结果,不考虑进位b=((unsigned int )carry)<<1;//由于之前没有考虑进位,后续需要把进位结果继续与sum相加//使用unsigned int 防止int类型溢出}return sum;
}

不使用算术运算符计算两数之和相关推荐

  1. 用函数计算两数之和和两数之积

    函数的优点 函数是面向过程编写的最重要的语法结构 在工程上函数可以使我们的代码更具有结构性,更加美观 函数也可以提升我们的代码可维护性 运用函数计算两数之和和两数乘积 int MyAdd(int _x ...

  2. 【计算两数之和】不使用加减乘除

    计算两数之和不论在计算机中还是生活中,都不算难(即使某些数据过大).但是如何能更高效的计算时一个难题,或者说在计算机内部是如何解析两个数之间的加法的,这就成了一个可以探讨的问题. 当然我们很了解十进制 ...

  3. linux-shell脚本-利用shell函数计算两数之和--思考return原理

    一.实例1(错误代码) 在shell脚本的学习过程中,遇到定义一个带有return语句的函数,来计算两数之和,代码如下: #!/bin/bash funWithReturn(){echo " ...

  4. 不使用 + 和 - 运算符计算两整数之和

    问题概述 不使用运算符 + 和 -,计算两整数之和 思考 不使用 + 和 - ,那就只能想到用位运算来处理了.思路如下: 两数进行 ^(异或运算),可以得到两个数在相同位上数值不同的相加结果 两数进行 ...

  5. 数组计算两数之和,三数之和,四数之和

    这种计算几个数据之和的题目, 一般分为 在同一个数组中计算几个数之和等于某一个值. 还有一种是给几个数组,每个数组中取一个数据,让你算几个数之和等于某一个值. 一般情况下,第二中的难度会更大,因为去重 ...

  6. 【Java】编写Java程序,完成从键盘输入两个运算数据,计算两数之和并输出结果...

    public class MyTest {public static void main(String[] args) {int a=2;int b=6;int c=a+b;System.out.pr ...

  7. html 计算两数之和,百度web前端面试题之求两个数的最大公约数和最小公倍数

    求两览页些求时是过解些这确如目前例总站回广随个数的最大公约数和最小公倍数,好是能览调不页新代些事几求事都时学下是事功过发,解像是第三题, 找到如下简洁遇新是直朋能到分览写法: <1> 用辗 ...

  8. JavaScript中如何用函数求任意两数之和?

    1.首先计算任意两数之和并输出,这里以1-100举例 var sum=0;for(var i=1;i<=100;i++) {sum=sum+i;} console.log(sum);这里打开页面 ...

  9. 不使用算术运算符(+/-)怎么求两数之和?

    今天遇到了这样一个题 题目说了不能用算数运算符,那么我们就只能从 逻辑运算符 和 移位运算符 入手了. 我们知道 ^ (异或)操作是对两个数进行无进位求和,如果两个数相加本来就不产生进位,那么该和就是 ...

最新文章

  1. Dockerfile镜像的制作
  2. SpringBoot_web开发-SpringMVC自动配置原理
  3. 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
  4. php中数组生成下拉选项,php利用数组填充下拉列表框
  5. Linux 文件系统与设备文件系统 (一)—— udev 设备文件系统
  6. 蓝桥杯 ADV-178 算法提高 简单加法
  7. POJ1009 Edge Detection
  8. 面向对象编程方法-抽象
  9. MySql常用语句 转
  10. 2019年最好用的6款数据库监控工具
  11. Code[VS]1997 守卫者的挑战
  12. 大功率锂电池组BMS(电池管理系统)保护板电路介绍(ACS758/CH704应用案例)
  13. 中国传统色的雅称——你可知?
  14. win7 计算机 其他 删除,win7双系统怎么删除一个?windows7双系统删除一个方法汇总...
  15. A00工具类学习之参考文献写法
  16. Perl中use strict
  17. 小块渲染VS渐进式渲染
  18. 【璟丰机电】HarmonicDrive哈默纳科行星齿轮减速机结构及其特点
  19. Hive基本SQL操作
  20. 茅山后裔吧 (转载,有好多不错的道理)

热门文章

  1. Socket マルチキャスト通信 - Windows Phone編
  2. Castle Winsor在Asp.net MVC中应用
  3. 番外篇:gitlab docker版数据和仓库迁移
  4. 深扒“微信乞丐” 教你如何不乞讨就赚大钱!
  5. 计算机基础统考模拟系统,计算机应用基础(统考)模拟1
  6. C#如何实现BMI指数的计算
  7. NYOJ740 - “炫舞家“ST (DP)
  8. 停车场自动收费系统php,智能停车场收费系统设计源码
  9. 计算机内存条插座可互换吗,不拆机可以查看电脑内存条插槽个数吗
  10. hdu2717 Catch That Cow