布斯乘法以及带符号数的运算

乘法理解

对于最熟悉的十进制乘法很最基本的运算原理就是一个乘数乘以另一个乘数的个位、十位、百位···数字然后求和。比如

在这里插入图片描述

放到二进制来看其实它也是这样的,多位数的乘法就是一个乘数乘上另一个乘数的各位求和。那么:
在这里插入图片描述

布斯算法及原理

原理

已经知道两个二进制数的乘法的实质是上面式子中那样了,假设例举的两个数1101和1110是无符号数,那么作乘法按照下面的式子来:

在这里插入图片描述

这里也体现了各位相乘最后求和的思想。按照上面直接来乘可以看到是要计算三位非0位与乘数的积然后求和,如果说一个乘数的非零位特别多1111111111110,那么运算次数就会更多。而布斯算法很好地解决了这个问题。既然加法会乘这么多次那么用减法就好了。所以上面的1110可以写成10000-10那么只用乘两次再作减就可以得到结果了,所以这就是布斯算法的原理。通过把求和转换成求差简化运算的次数。
具体算法

算法的基本思想是在乘数的末位添加一个"0",乘数中出现连续的"0"和连续的"1"处不进行任何运算;出现"10"时,作减法;出现"01"时作加法。每次只做一位乘法,因而每一步都右移一位。(来自于《计算机系统基础》)

依然以1101和1110为例(依然为无符号数),被乘数是1101,乘数是1110,我们知道:

在这里插入图片描述

上面的过程就体现了布斯算法的简化。由上面观察1110 -> 01110 -> (10000 - 10),把这个减法式子统一到一个位串里可以写成100(-1)0。上面的减法是为了简化运算,选什么数来作减可以把原来为1的位简化成0呢?明显是高位比11…10…0还高一位的100…00…0减去高位与11…10…0末位1同位的00…10…0序列,而01就标示出了一段连续1的开头,而10也标示出了一段连续1的结尾,只是开头的地方是加,而结尾的地方是减去(不知道说清楚没有),对于连续的1在转化过后明显都变成了0所以这些位就不用理睬。

下面实际地计算一下这两个无符号数1101和1110,结果和中间结果取8位:

在这里插入图片描述

带符号数的计算

无符号数按照常规的方法可作如下计算(依然沿用前面的例子):

在这里插入图片描述

得到的答案是正确的,但是当1101和1110是带符号数的时候,这个答案就不对。难道用常规方法就不能进行带符号数的运算吗。当时在看这部分的时候,书上有一句话“对于带符号整数乘法,大多数处理器中会使用专门的补码乘法器来进行运算,一位补码乘法称为布斯乘法”,所以那个时候在还不太了解布斯乘法,所以误以为该算法无法进行带符号数的运算。其实后来发现,常规算法也是可以计算的,但是结果为什么不对,原因在于:以上两个数为例,进行乘法时中间数其实是乘数和被乘数被扩展成8位后进行各位相乘再截断为8位得到的,所以还是先看成无符号数把位填充满得到的是如下:

在这里插入图片描述

而之前算不对原因并非在于是否使用了布斯乘法,而是进行扩展的时候依然按照无符号数的方式进行了0扩展,得到的结果自然不对。

现在把上面的数看成符号数处理,1101 = -3, 1110 = -2,所以正确计算后的结果应该是6:

在这里插入图片描述

00000110 = 6计算正确。但是这样的方式计算真的好长,因为非0位太多而要进行7次累加,换成布斯算法:

在这里插入图片描述

更加简单了,所以实际运算的时候使用的是补码乘法器运用布斯算法专门对带符号数进行运算。

布斯算法在乘法器中的应用

现在有两个带符号数a = -2和b = -3,他们在乘法器中的运算如下:

a与b补码的长度和为8位,又因为被乘数的末尾也可能是连续1的结尾,所以添加一个附加位0以能够作出10标志的识别。所以首先设一个P,长度为4 + 4 + 1 = 9,还有A和S,初始值如下:

在这里插入图片描述

每一次都读取P的末两位来判断现在是进行加操作还是减操作,加减操作过后每次还需要把P向右移,此处是算数右移。通过上面的描述其实能对应到之前讲的算法。P在10时作减,前面说过作减可以通过加负数补码解决,也就是加上S等同于作减法。P在01时作加,也就直接用P加A就行。分错开的初始值使得被乘数b与乘数a,不会被交叠而影响到对被除数中各位数的读取,而多次运算移位的过程其实就是手写运算时各位做乘,得到中间值然后累加的过程:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angular 接入 IdentityServer4

angular 接入 IdentityServer4Intro最近把活动室预约的项目做了一个升级,预约活动室需要登录才能预约,并用 IdentityServer4 做了一个统一的登录注册中心,这样以后就可以把其他的需要用户操作的应用统一到 IdentityServer 这里,这…

主机Redis服务迁移到现有Docker Overlay网络

“《麻雀虽小,五脏俱全》之主机现有Redis服务迁移到Docker Swarm Overlay网络,并搭建高可用容器集群。hello, 好久不见,之前文章记录了一个实战的2C分布式项目的改造过程,结果如下:其中Redis并未完成容器化改造&#x…

Java控制结构

控制结构 程序流程控制介绍 顺序控制 分支控制if-else 单分支 案例演示 01: import java.util.Scanner; public class IfWorkDemo {public static void main(String[] args){Scanner myScanner new Scanner(System.in);System.out.println("input your age");int…

.Net Core Configuration源码探究

前言上篇文章我们演示了为Configuration添加Etcd数据源,并且了解到为Configuration扩展自定义数据源还是非常简单的,核心就是把数据源的数据按照一定的规则读取到指定的字典里,这些都得益于微软设计的合理性和便捷性。本篇文章我们将一起探究…

面试官:你说你喜欢研究新技术,那么请说说你对 Blazor 的了解

阅读本文大概需要 1.5 分钟。最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历。面试官:“你刚说你喜欢研究新技术,那么你对 Blazor 了解多少?”作为一位专注于 .NET 开发的软件工程师,你好意思说你对…

Java变量

变量 ​ 变量是程序的基本组成单位 变量的介绍 概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)。 01: class Test {public s…

[Student.Achieve] 学生教务管理系统开源

(源自:https://neters.club)一觉醒来Github改版了,我个人还是挺喜欢的????。还有两个月就是老张做开源两周年了,时间真快,也慢慢的贡献了很多的开源作品,上边的是主要的七个作品&#xff0c…

.NET Core HttpClient源码探究

前言在之前的文章我们介绍过HttpClient相关的服务发现,确实HttpClient是目前.NET Core进行Http网络编程的的主要手段。在之前的介绍中也看到了,我们使用了一个很重要的抽象HttpMessageHandler,接下来我们就探究一下HttpClient源码&#xff0c…

Java 多线程:线程优先级

1 优先级取值范围 Java 线程优先级使用 1 ~ 10 的整数表示: 最低优先级 1:Thread.MIN_PRIORITY 最高优先级 10:Thread.MAX_PRIORITY 普通优先级 5:Thread.NORM_PRIORITY 2 获取线程优先级 public static void main(String[]…

《Unit Testing》1.1 -1.2 单元测试的目的

本系列是《Unit Testing》 一书的读书笔记 精华提取。书中的例子 C# 语言编写,但概念是通用的,只要懂得面向对象编程就可以。 单元测试当前的状态目前,在(美国的)大部分公司里,单元测试都是强制性的。生产…

Java Exception

Exception 异常捕获 将代码块选中->ctrlaltt->选中try-catch 01: public class Exception01 {public static void main(String[] args) {int n1 10;int n2 0;try {int res n1/n2;} catch (Exception e) { // e.printStackTrace();System.out.println(e.…

《Unit Testing》1.3 使用覆盖率指标来度量测试套件的好坏

使用覆盖率来度量测试套件(Test Suite)的质量有两种比较流行的测试覆盖率的度量方法:代码覆盖率分支覆盖率覆盖率度量会显示一个测试套件(Test Suite)会执行多少代码,范围从 0 至 100%。除了上述两种方法之…

Linux创始人:v5.8是有史以来最大的发行版之一

导语Linux v5.8已经修改了所有文件的20%,是迄今为止变化最大的一次发行版。正文Linux创始人Linus Torvalds表示:Linux内核5.8版是“我们有史以来最大的发行版之一”。如果一切顺利,Linux v5.8稳定版应该在2020年8月的某个时候出现…

[高等数学]这你不背?

求导及求微分的基本公式: 泰勒中值定理: 麦克劳林公式: 不定积分公式: 凑微分: 第二类换元积分法常用的三种情况: 求高阶导数的几个公式: 二阶常系数非齐次线性微分方程的特解: 排列组合公式: C的计算: 下标的数字乘以上标的数字的个数,且每个数字都要-1.再除以上标…

怎么开会才不浪费时间?

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「148」篇原创敬上大家好,我是Z哥,先祝大家端午节日快乐。节日期间就发篇比较短的文章吧。人在职场混,开会应该是本职工作之外花…

.NET 5.0预览版6发布:支持Windows ARM64设备

2020年6月25日,微软dotnet团队在博客宣布了第六个 .NET 5.0 的预览版:https://devblogs.microsoft.com/dotnet/announcing-net-5-0-preview-6/,在改进性能的同时增加了一些新的功能。ASP.NET Core和 EF Core也将于今日发布了。注意&#xff1…

利用真值表法求取主析取范式以及主合取范式的实现(C++)

代码如下: #include <iostream> #include <stack> #include <string> #include <vector> using namespace std; const int N 300; stack<char> s; stack<char> v; int seq; bool vis[N]; bool flag[N]; void dfs(int n); vector<int&…

基于 Blazor 开发五子棋小游戏

今天是农历五月初五&#xff0c;端午节。在此&#xff0c;祝大家端午安康&#xff01;端午节是中华民族古老的传统节日之一。端午也称端五&#xff0c;端阳。此外&#xff0c;端午节还有许多别称&#xff0c;如&#xff1a;午日节、重五节、五月节、浴兰节、女儿节、天中节、地…

汇编cmp比较指令详解

刚刚看到了cmp指令&#xff0c;一开始有点晕。后来上网找了些资料&#xff0c;终于看明白了&#xff0c;为了方便初学者&#xff0c;我就简单写下我的思路吧。高手绕过&#xff0c;谢谢&#xff01; cmp(compare)指令进行比较两个操作数的大小例:cmp oprd1,oprd2为第一个操作减…