189 8069 5689

补码一位乘法java代码 java补码运算

求补码一位乘(booth乘法 比较法)计算x=11011y=-11111求x*y的详细过程

换成十进制,X=16+8+0+2+1=27。

成都创新互联专注于同江企业网站建设,成都响应式网站建设,购物商城网站建设。同江网站建设公司,为同江等地区提供建站服务。全流程按需规划网站,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务

Y=-(16+8+4+2+1)=31。

故X*Y=-837。

换成二进制。

等于1100000101。

计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

已知x=0.110111,y=-0.101010用Booth算法(补码一位乘)计算x·y,要求写出其运算过程。

[x] 原 =0.110111 , [y] 原 =1.101110 , x*=0.110111 , y*=0.101110 原码一位乘: 部分积 乘数y* 说明 0.000 000 +0.000 000 101 11 0 部分积初值为0,乘数为0加0 0.000 000 0.000 000 +0.110 111 010 11 1 右移一位 乘数为1,加上x* 0.110 111 0.011 011 +0.110 111 101 01 1 右移一位 乘数为1,加上x* 1.010 010 0.101 001 +0.110 111 010 10 1 右移一位 乘数为1,加上x* 1.100 000 0.110 000 +0.000 000 001 01 0 右移一位 乘数为0,加上0 0.110 000 0.011 000 +0.110 111 000 10 1 右移一位 乘数为1,加上x* 1.001 111 0.100 111 100 010 右移一位 即 x*×y*=0.100 111 100 010 , z0=x0 Å y0=0 Å 1=1 , [x×y] 原 =1.100 111 100 010 , x·y= -0. 100 111 100 010 原码两位乘: [-x*] 补 =1.001 001 , 2x*=1.101 110 部分积 乘数y* C j 说明 000.000 000 + 001.101 110 001011 10 0 部分积初值为0,C j =0 根据y n-1 y n C j =100,加2x*,保持C j =0 001.101 110 0 000. 011 011 + 111. 001 001 10 001 0 11 10 001 0 11 0 右移2位 根据y n-1 y n C j =110,加[-x*] 补 ,置C j =1 111 . 100 100 111 . 111 001 +111 . 001 001 00 100 0 10 1 右移2位 根据y n-1 y n C j =101,加[-x*] 补 ,置C j =1 111. 000 010 111. 110 000 +000.110 111 10 001 0 00 1 右移2位 根据y n-1 y n C j =001,加x*,保持C j =0 000.10

java求补码

~在c和java语言中都是求反码,或者叫位非NOT运算。

java的运算有特殊性:

4的二进制为100,

执行~4后转换成32位有符号整型(int),值为11111111111111111111111111111011

打印时,按有符号解释成-5。

C语言的运算和java大类相同,但要注意几点

1、注意意无符号的情况。unsigned int i=~4;的值就是4294967291

2、注意变量的数据长度。在c中,char和char之间,short和short之间,long和long之间的加减都按本身定义的长短。而不像java都统一转换成32位int后进行运算

3、注意显示时符号的有无。printf中的%d和%u对显示结果就有本质区别

用补码一位乘法计算X*Y的补码,写出计算过程,X=0.1010,Y= -0.0111

X的补码为0.1010,-X的补码为1.0110,Y的补码为1.1001(低位有4位)。

高位 低位(乘数补码处理值) 说明

00 0000 |110010 最低位10,高位加-X的补码

11 0110

————

11 0110

11 1011 01|1001 执行右移,最低位01,高位加X的补码

00 1010

————

00 0101

00 0010 10|1100 执行右移,最低位00,高位加0

00 0000

————

00 0010

00 0001 010|110 执行右移,最低位10,高位加-X的补码

11 0110

————

11 0111

11 1011 1010|11 执行右移,乘数补码被右移出去,进行最后一次

00 0000 运算,最低位11,高位加0

————

11 1011 1010|11

最终结果为11.10111010,因为补码一位乘结果用的是双符号位,换成单符号位就是1.10111010。

我总结了点补码一位乘的方法,给你参考下

处理对象:被乘数补码*乘数补码=两数积的补码。

预处理: 1、单独算出被乘数的相反数的补码,同时乘数补码往右扩一位补0(乘数补码处

理值),积的符号位与其余位必须一同计算。

2、两数补码相乘拆分为多个加法运算。

3、每次加法运算分为高位和低位两部分处理,高位初始值为0、位数是在带符号被乘

数位数基础上向左扩一位(利于右移),低位初始值是乘数补码处理值、位数与乘数

数据位位数相同。

第一次加:4、第一次加法是由高位和加数相加,加数的值由乘数补码处理值的最低两位确定

(若为01,加数为被乘数补码,若为10,加数为被乘数的相反数的补码,若这两位

的数值相等,则加数为0;加数左边多余的一位根据其符号位确定补0还是补1,符

号位为0则补0,符号位为1则补1)。

5、此次加法运算结束后,加法运算所得的高位(部分积)与低位合成一个整体并右移1

位得到新的高位和低位(右移时左边补0还是补1由右移前的符号位确定,符号位为

0则补0,符号位为1则补1,,另外在右移时乘数补码处理值也连带着右移)。

第二次加:6、高位再次进行加法处理,加数的值由新得到的乘数补码处理值的最低两位确定(确

定方法同第4点)。

7、此次加法运算结束后,加法运算所得的高位(部分积)与低位合成一个整体并右移1

位得到新的高位和低位(右移时高位左边补0或1的确定方法同第5点,另外在右移

时乘数补码处理值也连带着右移)。

循环加法:8、按“第二次加”的方法循环,直至低位将乘数补码处理值的每一位都右移出去后,

再进行一次加法运算(此次加法运算结束后不进行右移),此时得到的高位和低位

合成一个整体就是最终乘积,这个最终乘积是双符号位。

9、所得的最终乘积的小数位数必须是被乘 数补码与乘数补码的小数位数之和。

关于双符号位:00 正,11 负,01 上溢,10 下溢。

附注:无论是原码一位乘,还是补码一位乘、补码二位乘,与手工算法都有共通之处,都是根据

乘数每一位(或两位) 的状态在被乘数的基础上来确定加数(如被乘数、被乘数补码、被

乘数相反数补码、0),因为乘数是二进制的, 每一位只有0、1两种状态,所以又免去

了手算十进制乘法中以乘数每一位去乘被乘数来确定加数的过程,而右 移所得的部分

积就相当于手算乘法中左移加数。


网站栏目:补码一位乘法java代码 java补码运算
链接URL:http://cdxtjz.cn/article/ddophgd.html

其他资讯