一、前置知识

为了能够快速的理解最后的算法,这里先准备一些前置知识。这些所谓的前置知识可以理解为“点”,最后只要把这些“点”串联为“线”,就会得到最终的答案。

1. a ^ b的含义

首先探索一下在二进制中a^b的结果,然后给这个结果加一个定义。

(1)穷举实例

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

根据异或运算的运算规则,对于某个二进制位上的两个数,如果这两个数同为0或者1那么异或的结果一定为0,否则异或的结果为1。
将异或运算和加法运算对比一下,得到如下的结果。

0 ^ 0 = 0 c 0 + 0 = 0
1 ^ 1 = 0 --------------------- 1 + 1 = 1 0
0 ^ 1 = 1 --------------------- 0 + 1 = 1
1 ^ 0 = 1 --------------------- 1 + 0 = 1

(2)结论

两个数a和b进行异或运算,在二进制角度,相当于对每对对应的bit位做了不进位的加法运算。

2. a & b的含义

(1)穷举实例

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

根于与运算的运算规则,对于某个二进制位上的两个数,如果这两个数都为1时得到的结果为1,否则得到的结果为0。
将与运算和加法运算对比一下,得到如下的结果。

0 & 0 = 0 --------------------- 0 + 0 = 0 进位值为0
0 & 1 = 0 --------------------- 0 + 1 = 1 进位值为0
1 & 0 = 0 --------------------- 1 + 0 = 1 进位值为0
1 & 1 = 1 --------------------- 1 + 1 = 1 0 进位值为1

(2)结论

两个数a和b进行异或运算,在二进制角度,相当于记录了每对对应的bit位进行加法运算以后所产生的进位。

(3)<< 位移

(2)中的结果将产生的进位记录在了运算的位置上,那么如果将整体左移1位,那么恰好就是把进位值移动到了应该被进到的位置上。

二、 连点成线

有了一种的前置知识以后,就可以按照如下的步骤来计算两个数的和了。这里设两个数为a 和 b。会得到如下的计算步骤。

  • 把二进制的每一位都进行不进位的加法。
  • 获取到每个bit位向上的进位值。
  • 继续进行不进位的加法。
  • 获取到每个bit位向上的进位值。
  • 继续进行不进位的加法。

三、代码

public int getSum(int a, int b) {while (b != 0) {int m = (a & b) << 1;a = a ^ b;b = m;}return a;}

不使用加法计算两个数的和相关推荐

  1. python求两数之和的命令_python计算两个数的百分比方法

    工作中遇到了要计算两个数百分比的问题,python 2.7 环境. 代码: #!/usr/bin/env python #function: 计算百分比 #USAGE: python calculat ...

  2. python计算两个数的最大公约数和最小公倍数

    文章目录 计算最大公约数(暴力求解和辗转相除法) 计算最小公倍数 计算最大公约数(暴力求解和辗转相除法) 方法一:暴力求解 def hcf(x,y):smaller = x if x<y els ...

  3. python怎么计算百分比_python计算两个数的百分比方法

    工作中遇到了要计算两个数百分比的问题,python 2.7 环境. 代码: #!/usr/bin/env python #function: 计算百分比 #USAGE: python calculat ...

  4. 计算两个数之差的绝对值

    程序: #include <stdio.h>//从键盘输入两个整数 ,调用库函数 计算两个数之差的绝对值 //带符号相减int SBB(int a,int b) {int S = 0;S ...

  5. 计算两个数平均值的三种方法

    第一种方法: 思路:两数相加求和再除2 代码 int a=10;int b=20;int avg=0;avg=(a+b)/2;//平局值//或者avg=(a+b)>>1://右移表示除2, ...

  6. 编写一个函数,实现计算两个数大小的比较,且返回最大值。

    例子:编写一个函数,实现计算两个数大小的比较,且返回最大值. 解释:当$a大于$b,返回最大值$a,当$b大于$b,返回最大值$b,否则输出null            实现效果:          ...

  7. 编写一个程序,计算两个数的最大公约数

    """ 两个或多个整数公有的倍数叫做它们的公倍数 """ # 定义一个函数 def hcf(x, y):""" ...

  8. 【python】以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积(廖雪峰)

    练习 以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积: # -*- coding: utf-8 -*- # -*- coding: utf-8 -*- def produc ...

  9. 【转载】不用加号和减号计算两个数的加法

    原文地址:https://www.namidame.tech/calculate-plus-without-plus-sign.html 1. 问题描述 设计一个函数把两个数字相加.不得使用 + 或者 ...

最新文章

  1. android绘制心形_Android自定义View系列(一)——打造一个爱心进度条
  2. 马上要毕业了,要就业了。。担忧啊
  3. 如何在更大的div内使图像中心(垂直和水平)居中[重复]
  4. 使用Sublime Text 3作为Python编辑器有关中文问题
  5. MySQL InnoDB的内存管理
  6. python人脸识别训练模型生产_深度学习-人脸识别DFACE模型pytorch训练(二)
  7. [vue] watch和计算属性有什么区别?
  8. 一种软阴影的实现方法
  9. java random产生随机数_Random随机数
  10. 深度学习中拟合是什么意思?
  11. 新版中日交流标准日本语|百度云盘免费下载
  12. 云课堂让职业院校Web前端教学更简单
  13. 【微信小程序】-授权获取微信绑定手机号两种方案
  14. python求矩阵逆、伪逆、转置、矩阵乘法
  15. Oracle递归的实现
  16. 栈帧及EBP、ESP寄存器及出入栈的流程
  17. js--定时器的使用
  18. web安全之Webshell管理工具
  19. 关于打包处理less文件时遇见的问题:
  20. S60v5 GBA模拟器gpSP4Symbian v0.5安装使用图文教程

热门文章

  1. PLSQL Developer 9_64位下载 连接Oracle详细步骤
  2. IE9 下载管理,轻松您的下载
  3. MK趋势检验和MK突变检验
  4. 个人对win7开机黑屏只有鼠标排障总结
  5. labview信号处理算法先进性比较
  6. UPS市场排名“第一”泛滥 三点绝招巧识猫腻
  7. Leetcode 735. 行星碰撞
  8. 气象业务信息中linux,在Ubuntu 14.10中如何安装和配置‘天气信息指示器’
  9. 2021-02-01 PMP 群内练习题 - 光环
  10. C语言操作符之前置++/后置++