以下讲解内容出自《计算机组成原理(第三版)》(清华大学出版社)
大二学生一只,我的计组老师比较划水,不讲公式推导,所以最近自己研究了下Booth算法的公式推导,希望能让同样在研究Booth算法的小伙伴少花点时间。
 

下面将对上图公式方框中部分进行讲解。

 
首先要摆明一个公式。
**公式X**: - [B]补 = [-B]补 ; [B]补 = - [-B]补
 
意思是 一个数A的补码,等于该补码的机器负数 (机器负数的定义可以见书P85 简单理解一个数Y的机器负数 = [-Y]补)
前加负号的数
比如:
 01100 (12) - [00101(5)]补 = 01100(12) + 10101(-5的补码) = (01100 + 11011)(补码) = 00111 (7的原码和补码)
 
解释1框框:
因为乘数为小数,0.ABCD = A*(2^(-1)) +  B*(2^(-2)) + C*(2^(-3)) + D*(2^(-4))。就和1111 = 1 + 2 + 4 + 8 一个道理。
 
解释2框框内容:
根据公式X, 第二行的 + [-X] 补 * Ys = - [X]补 * Ys
由此得第三行的 -Ys * [X]补
 
解释3框框中的图:
这个框中的意思是一个二进制小数,向左移动一位(乘2),再减去原来的自己,还是等于自己。利用了二进制 高一位 是 低一位两倍的关系。
看上图中,Y1本来是表示Y1*(2^(-1))次方的大小的 ,但是在3框框中却变成了 1 * Y1(左移了一位), 其他位以此类推。并且减去了表示原来的自己的 Y1*(2^(-1)),结果还是 Y1*(2^(-1)),所以等于原来的自己,其他位以此类推。
 
下图的Zn是部分积,并且把部分积从原式中拆解出来后,可以根据这些拆解式分析出Booth算法一位乘法补码运算时的过程
 
 

蓝色框框里的 Y(n+1) - Yn 就是乘数的末两位了(被乘数移位之后),当 Y(n+1) - Yn  = - 1 的时候,

(Y(n+1) - Yn)* [X]补 * 2^(-n) =  (-1) * [X]补 * 2^(-n) = + [-X]补码 * 2^(-n) , X是被乘数,这也可以解释为什么Booth里末两位为10时,要加[-X]补 (因为 Y(n+1) = 0, Yn = 1)。 为什么 Y(n+1) - Yn  = 1 (末两位01)的时候 要加[X]补。而Y(n+1) - Yn  = 0 (末两位为11 或者 00)的时候什么都不做(1 - 1 = 0, 0 - 0 = 0)。而 2^(-n) 中的n则是当前部分积相对原来开始时右移的位数,所以(Y(n+1) - Yn)* [X]补 * 2^(-n) 解释起来就是 (Y(n+1) - Yn) 根据乘数末两位来确定 -1,0 , 1。也就是加还是减或者什么都不做。[X]补是原来被乘数的补码,因为乘数Y是1和0组成的,所以整个乘法X*Y的过程就是在决定要不要加X,或者不加的过程,当然补码运算比较特殊,还有减去操作。而2^(-n)的n则是表示当前乘法部分积移动的位数。
 
下图是部分积拆解结果和运算过程的对应关系分析
 

 
 
 
 
 
 
 
 
 

Booth算法: 补码一位乘法公式推导与解析的更多相关文章

  1. 补码一位乘法 Booth算法 Java简易实现

    本文链接:https://www.cnblogs.com/xiaohu12138/p/11955619.html. 转载,请说明出处. 本程序为简易实现补码一位乘法,若代码中存在错误,可指出,本人会不 ...

  2. 补码一位乘法(Booth算法,C语言实现)

    补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 ...

  3. BOOTH 算法的简单理解

    学习FPGA时,对于乘法的运算,尤其是对于有符号的乘法运算,也许最熟悉不过的就是 BOOTH算法了. 这里讲解一下BOOTH算法的计算过程,方便大家对BOOTH的理解.        上图是BOOTH ...

  4. Booth算法

    Booth算法 算法描述(载自维基百科) 对于N位乘数Y,布斯算法检查其2的补码形式的最后一位和一个隐含的低位,命名为y-1,初始值为0.对于yi, i = 0, 1, ..., N - 1,考察yi ...

  5. 「C语言」原码反码补码与位运算

    尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解.     本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出.   目录 ...

  6. java原码反码补码以及位运算

    原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...

  7. 【老鸟学算法】大整数乘法——算法思想及java实现

    算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...

  8. JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  9. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

随机推荐

  1. python:函数中的*args与**kwargs

    首先定义一个包含*args和**kwargs的函数,这个函数唯一的功能就是输出自己的两个参数,以此来理解*args和**kwargs def myFunc(*args, **kwargs): prin ...

  2. Java-POJ1011-sticks

    很经典的搜索题,直接爆搜会卡在连续相同长度的木棍,可以先排序,预处理该长度不行直接跳下一长度木棍的位置 但此题特殊,木棍长度小于50,我们可以直接桶排序 还有就是关于回溯的理解: 我们写的dfs为的是 ...

  3. Oracle中行转列,列转行pivot的用法

    测试数据准备 --建表 --drop table SalesList; create table SalesList( keHu ), --客户 shangPin ), --商品名称 salesNum ...

  4. Integer.parseInt(s)、Integer.valueOf(s)与new Integer()的异同

    我们在开发过程中,很多时候需要将String类型数据转换成Integer,而比较常用的方式就是--nteger.parseInt(s).Integer.valueOf(s)与new Integer() ...

  5. pyfits fits图像区域选择

    在用pyfits读取fits格式的图像时,得到的数组的结构如下 f=pyfits.open('rr.fits') data1=f[0].data data1数组的第一行,对应于图像的最下面一行,数组第 ...

  6. 全网最详细!搭建Hexo+Coding/Gitee,实现一键生成,同步部署

    全网最全小白搭建Hexo+Gitee/Coding/Github 全网最全小白搭建Hexo+Gitee/Coding/Github 本站内容已全部转移到https://www.myyuns.ltd,具 ...

  7. main函数的参数详解

    1.定义 C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv.因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整 ...

  8. 编译和链接(lib和dll区别)(转载)

    1.头文件并不参加链接和编译.编译器第一步要做的就是简单的把头文件在包含它的源文件中展开.不知你是否能理解这句话.也就是头文件里面有什么内容,通通把它移到包含这个头文件的源文件里.(我觉得这是个很重要 ...

  9. CDQ 分治

    引言: 什么是CDQ分治?其实这是一种思想而不是具体算法,因此CDQ分治覆盖的范围相当广泛,在 OI 界初见于陈丹琦 2008 年的集训队作业中,故被称为CDQ分治. 大致分为三类: cdq分治解决与 ...

  10. Go_goroutine初识

    package main import ( "fmt" ) func main() { /* 一个goroutine打印数字,另外一个goroutine打印字母,观察运行结果.. ...