不使用加法计算两个数的和
一、前置知识
为了能够快速的理解最后的算法,这里先准备一些前置知识。这些所谓的前置知识可以理解为“点”,最后只要把这些“点”串联为“线”,就会得到最终的答案。
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;}
不使用加法计算两个数的和相关推荐
- 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 实现效果: ...
- 编写一个程序,计算两个数的最大公约数
""" 两个或多个整数公有的倍数叫做它们的公倍数 """ # 定义一个函数 def hcf(x, y):""" ...
- 【python】以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积(廖雪峰)
练习 以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积: # -*- coding: utf-8 -*- # -*- coding: utf-8 -*- def produc ...
- 【转载】不用加号和减号计算两个数的加法
原文地址:https://www.namidame.tech/calculate-plus-without-plus-sign.html 1. 问题描述 设计一个函数把两个数字相加.不得使用 + 或者 ...
最新文章
- android绘制心形_Android自定义View系列(一)——打造一个爱心进度条
- 马上要毕业了,要就业了。。担忧啊
- 如何在更大的div内使图像中心(垂直和水平)居中[重复]
- 使用Sublime Text 3作为Python编辑器有关中文问题
- MySQL InnoDB的内存管理
- python人脸识别训练模型生产_深度学习-人脸识别DFACE模型pytorch训练(二)
- [vue] watch和计算属性有什么区别?
- 一种软阴影的实现方法
- java random产生随机数_Random随机数
- 深度学习中拟合是什么意思?
- 新版中日交流标准日本语|百度云盘免费下载
- 云课堂让职业院校Web前端教学更简单
- 【微信小程序】-授权获取微信绑定手机号两种方案
- python求矩阵逆、伪逆、转置、矩阵乘法
- Oracle递归的实现
- 栈帧及EBP、ESP寄存器及出入栈的流程
- js--定时器的使用
- web安全之Webshell管理工具
- 关于打包处理less文件时遇见的问题:
- S60v5 GBA模拟器gpSP4Symbian v0.5安装使用图文教程
热门文章
- PLSQL Developer 9_64位下载 连接Oracle详细步骤
- IE9 下载管理,轻松您的下载
- MK趋势检验和MK突变检验
- 个人对win7开机黑屏只有鼠标排障总结
- labview信号处理算法先进性比较
- UPS市场排名“第一”泛滥 三点绝招巧识猫腻
- Leetcode 735. 行星碰撞
- 气象业务信息中linux,在Ubuntu 14.10中如何安装和配置‘天气信息指示器’
- 2021-02-01 PMP 群内练习题 - 光环
- C语言操作符之前置++/后置++