补码一位乘法的c语言代码,定点数乘法运算:Booth算法(补码一位乘法)C 实现...

文章目录综述定点数的乘法运算Booth算法分析Booth算法的C实现

综述

在计算机中参与运算的机器数有两大类:无符号数和有符号数。

下面主要讲解有符号数:

在机器中,数的“正”、“负”号是无法识别的,有符号数用“0”表示正,用“1”表示负号,从而将符号数值化,并通常约定二进制数的最高位是符号位,即符号位放在有效数字的前面,组成有符号数。

有符号数的机器表示有原码、补码、反码和移码。

根据小数点的位置是否固定,在计算机中的有两种数据格式:定点表示和浮点表示。接下来我们将介绍的算法都是定点表示。

有关浮点数的内存存储及介绍请参考我的另一篇博文:

《浮点数在内存中的存储方式与运算陷阱》

定点表示即约定机器数中的小数点位置是固定不变的,小数点不再使用 “ . ” 表示,而是约定它的位置。理论上,小数点位置固定在哪一位都是可以的,但在计算机中通常采用两种简单的约定

将小数点的位置固定在数据的最高位之前,一般称为定点小数

将小数点的位置固定在数据的最高位之后,一般称为定点整数

定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。

定点整数是纯整数,约定小数点位置在符号位有效数值部分最低位之后。

本文将介绍定点数的乘法运算。

定点数的乘法运算

在计算机中,乘法运算由累加和右移操作实现。根据机器数的不同,可分为

原码一位乘法

补码一位乘法

原码一位乘法的规则比补码一位乘法简单。我们下面主要介绍补码一位乘法(Booth)算法。

Booth算法分析

这是一种有符号数的乘法,采用相加和相减操作计算补码数据的乘积。

设 [X]补 = Xs.X1X2···Xn, [Y]补 = Ys.Y1Y2···Yn,则运算规则如下:

符号位参与运算,运算的数均以补码表示

被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数可取单符号位

乘数末尾增设附加位Yn+1,且初值为0

根据(Yn,Yn+1)的值来确定操作,具体见下表

移位按照补码右移规则进行

按照上述算法进行 n+1 步操作,但 n + 1 步不再移位(共进行 n + 1 次累加和 n次右移),仅根据Yn 与 Yn+1 的比较结果做相应的运算。

0c3eac55078d3eb81199e920c1d4e8eb.png

接下来我们分析一个实例:

设机器字长为5位(含一位符号位,n = 4),x = -0.1101,y = 0.1101,采用Booth算法求解 x · y。

8658fb323a288145810352ee230172e9.png

Booth算法的C实现

通过上述分析,我们通过C语言来实现Booth算法。

问题描述:使用纯C实现Booth算法,不允许调用除输入输出外的其他功能库函数。

问题分析:

我们需要完成下述功能:

输入x、y,计算出 [X]补、[-X]补、 [Y]补

将X改为双符号位数

部分积取双符号位,初值为0

分割乘数,获取(Yn,Yn+1)的值

根据(Yn,Yn+1)的值执行相应操作

完整设计如下:

/**

* Copyright: Copyright(c) 2019

* Created on 26/4/2019

* Author : ZYZMZM

* Version 1.0

* Title : Booth Algorithm

**/

#include

/* 存储被乘数 x 的补码 */

char xCom[20] = { 0 };

/* 存储 -x 的补码 */

char mxCom[20] = { 0 };

/* 存储乘数 y 的补码 */

char yCom[20] = { 0 };

/* 存储乘数 y 末位增加 0 */

char multiNum[20] = { 0 };

/* 存储部分积的初值 */

char multiSrc[20] = { 0 };

/* 计算字符串长度 */


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部