二进制实现加法_递归实现十进制转换二进制
大家好,又见面了,我是你们的朋友全栈君。
一、原理
1、化简
先看一个例子: 看一下 3 + 4 的加法运算
3 的二进制表示: 011 4 的二进制表示: 100
3^4 (3按位异或4)的结果是: 111 => 7 上面的到的结果是就是 3 + 4 的实际结果
再看一个例子:
12 的二级制表示: 01100 19 的二进制表示: 10011
12^19 的结果是: 11111 => 31
再看一个例子: 13 的二进制表示:01101 19 的二进制表示:10011
13^19 的结果是: 11110 => 20
通过上面的三个例子不难发现: 当二进制数的每一位加法中不发生进位时,按位异或的结果就是最终的加法结果,那么我需要做的就是将所有的加法操作最终都简化成没有进位的加法操作,最终的结果就是两个数按位异或的结果。
2、怎么处理有进位的加法?
拆分 将两个数的加法拆分为 进位加法和不进位加法
看一个例子:
编号:1 2 3 4 5 ———————— 1 0 0 1 1 => 19 + 1 1 0 1 0 => 26 ————————–
先求只有不进位的两个位相加的值,编号为2、3、5这三位的加法不发生进位操作,需要进位的相加位数直接按照结果为0处理,得到的结果为
编号:1 2 3 4 5
———————— 1 0 0 1 1 + 1 1 0 1 0 ———————— 不进位: 0 1 0 0 1
进位两个位相加的值,编号为1、4这三位的加法会发生进位操作,不需要进位的直接按照结果0处理,得到的结果为:
编号:1 2 3 4 5 ———————— 1 0 0 1 1 + 1 1 0 1 0 ———————— 不进位: 0 1 0 0 1 进 位: 1 0 0 1 0 0
再将两个结果按位异或: 不进位:0 0 1 0 0 1 进 位:1 0 0 1 0 0 ———————— 1 0 1 1 0 1 => 45
由此可见可以将一个二进制加法拆分为有进位的位数相加结果 和 无进位的位数相加的结果最终按位异或
3、递归
再看一个例子
编号:1 2 3 4 5 ————————
1 0 1 1 1 => 23 + 1 1 0 1 1 => 27 ————————
不进位: 0 1 1 0 0 => 12 进 位: 1 0 0 1 1 0 => 38
通过一次相加得到的结果不能完全实现化简操作,所以需要递归地进行化简操作
编号:1 2 3 4 5 ————————
1 0 1 1 1 => 23 + 1 1 0 1 1 => 27 ————————
不进位: 0 0 1 1 0 0 => 12 进 位:1 0 0 1 1 0 => 38 ————————
不进位:1 0 1 0 1 0 => 42 进 位:0 0 1 0 0 0 => 8 ————————
不进位:1 0 0 0 1 0 => 34 进 位:0 1 0 0 0 0 => 16 ————————
不进位:1 1 0 0 1 0 => 50 进 位:0 0 0 0 0 0 => 0
以上实例通过递归的方式可以得到最终的结果
二、位运算实现
通过以上几个实例我们明白了如何通过二进制的几个步骤来实现任意整数的加法操作,现在我们需要把这件事情用位运算进行表示。
位运算表示不进位加法: 不进位加法其实就是一个异或操作 位运算表示进位加法: 进位加法其实就是一个与操作的结果左移一位
三、代码实现
js实现:
function sum (a, b) {
if (b===0) return a;
return sum(a^b, (a&b)<<1)
}
java实现:
public int sum(int a, int b) {
if (b==0) return a;
return sum(a^b, (a&b)<<1);
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168378.html原文链接:https://javaforall.cn
相关文章
- int型转换为long型遇到的一个小问题
- 二进制如何转十进制?_二进制转换为十进制的算法
- 进程处于挂起状态表示_挂起进程转换图
- 【说站】python中capitalize的三种转换操作
- 格雷码与二进制的转换[通俗易懂]
- 二进制与十进制的相互转换
- 十进制转换为二进制java_二进制转八进制算法
- 计算机基础进制转换(二进制、八进制、十进制、十六进制)[通俗易懂]
- 十进制小数转换为二进制[通俗易懂]
- Java 中图片与二进制之间如何相互转换?
- jquery json对象转换详解编程语言
- Linux中二进制转换快速实现(linux二进制转换)
- 文件Linux转换二进制文件:指南(linux转换二进制)
- 由MySQL转换到SQLite的技术实现(mysql转sqlite)
- MySQL:从字符到二进制的转换(mysql字符转二进制)
- Oracle转换日期之妙招(oracle转化日期)
- 从MSSQL中转换回车换行的方法(mssql 转换回车换行)
- 转换如何快速转换Oracle二进制数据(oracle二进制如何)
- Oracle代码转换从代码到名称的转变(oracle代码转名称)
- 在Oracle中将中文字符转换为二进制(oracle中文转二进制)
- UBB转换函数演示(经典论坛)
- asp实现二进制字符串转换为Unicode字符串
- JS文字符串转换unicode编码函数
- PHP时间转换Unix时间戳代码
- java中字符串与日期的转换实例
- md516位二进制与32位字符串相互转换示例
- java实现无符号数转换、字符串补齐、md5、uuid、随机数示例