二进制补码乘法运算 二进制除法
- 软件开发
- 2023-08-13
- 92
大家好,如果您还对二进制补码乘法运算不太了解,没有关系,今天就由本站为大家分享二进制补码乘法运算的知识,包括二进制除法的问题都会给大家分析到,还望可以解决大家的问题,下...
大家好,如果您还对二进制补码乘法运算不太了解,没有关系,今天就由本站为大家分享二进制补码乘法运算的知识,包括二进制除法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
二进制补码怎么计算的
-85负就是1,然后计算正85:+85的原码(1010101)→按位取反(0101010)→加1(0101011)
10101011(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)
所以-7的补码是11111001。
二进制乘法详细过程
二进制的加法运算
二进制数的加法运算法则只有四条:0+0=00+1=11+0=11+1=10(向高位进位)
例:计算1101+1011的和
由算式可知,两个二进制数相加时,每一位最多有三个数:本位被加数、加数和来自低位的进位数.
按照加法运算法则可得到本位加法的和及向高位的进位.
二进制数的乘法运算
二进制数的乘法运算法则也只有四条:0*0=00*1=01*0=01*1=1
例:计算1110×1101的积
由算式可知,两个二进制数相乘,若相应位乘数为1,则部份积就是被乘数;若相应位乘数为0,则部份积就是全0.部份积的个数等于乘数的位数.以上这种用位移累加的方法计算两个二进制数的乘积,看起来比传统乘法繁琐,但它却为计算机所接受.累加器的功能是执行加法运算并保存其结果,它是运算器的重要组成部分.
二进制1101的补码怎么计算
同学们,大家好!我们应该都知道二进制数1101应该是一个负数,所以说二进制数1101的原码就应该是1101,负数二进制数1101的反码就应该是1010,最后求出负数二进制数1101的补码就应该是1011,同学们,你们大家都看明白了没有啊,再多看几遍
x补码与y补码乘积运算
X的补码为0.1010,-X的补码为1.0110,Y的补码为1.1001(低位有4位)。
高位低位(乘数补码处理值)说明
000000|110010最低位10,高位加-X的补码
110110
————
110110
11101101|1001执行右移,最低位01,高位加X的补码
001010
————
000101
00001010|1100执行右移,最低位00,高位加0
000000
————
000010
000001010|110执行右移,最低位10,高位加-X的补码
110110
————
110111
1110111010|11执行右移,乘数补码被右移出去,进行最后一次
000000运算,最低位11,高位加0
————
1110111010|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两种状态,所以又免去
了手算十进制乘法中以乘数每一位去乘被乘数来确定加数的过程,而右移所得的部分
积就相当于手算乘法中左移加数。
觉得有用点个赞吧
补码公式
二进制补码运算公式:
-x=~x+1=~(x-1)
~x=-x-1
-(~x)=x+1
~(-x)=x-1
x+y=x-~y-1=(x|y)+(x&y)
x-y=x+~y+1=(x|~y)-(~x|y)
x^y=(x|y)-(x&y)
x|y=(x&~y)+y
x&y=(~x|y)-~x
x==y:~(x-y|y-x)
x!=y:x-y|y-x
x<y:(x-y)^((x^y)&((x-y)^x))
x<=y:(x|~y)&((x^y)|~(y-x))
x<y:(~x&y)|((~x|y)&(x-y))//无符号x,y比较
x<=y:(~x|y)&((x^y)|~(y-x))//无符号x,y比较
应用举例
(1)判断int型变量a是奇数还是偶数
a&1=0偶数
a&1=1奇数
(2)取int型变量a的第k位(k=0,1,2……sizeof(int)),即a>>k&1
(3)将int型变量a的第k位清0,即a=a&~(1<<k)
(4)将int型变量a的第k位置1,即a=a|(1<<k)
(5)int型变量循环左移k次,即a=a<<k|a>>16-k(设sizeof(int)=16)
(6)int型变量a循环右移k次,即a=a>>k|a<<16-k(设sizeof(int)=16)
(7)整数的平均值
对于两个整数x,y,如果用(x+y)/2求平均值,会产生溢出,因为x+y可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
intaverage(intx
二进制变形补码计算
1、正数的补码表示:
正数的补码=原码
负数的补码={原码符号位不变}+{数值位按位取反后+1}or
={原码符号位不变}+{数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+97和-97为例:
+97原码=0110_0001b
+97补码=0110_0001b
-97原码=1110_0001b
-97补码=1001_1111b
2、纯小数的原码:
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。
以0.64为例,通过查阅可知其原码为0.1010_0011_1101_0111b。
操作方法:
将0.64*2^n得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。
此处将n取16,得
X=41943d=1010_0011_1101_0111b
即0.64的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为0.64d=0.1010_0011_1101_0111b与查询结果一致。
再实验n取12,得
X=2621d=1010_0011_1101b即0.64d=0.1010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。
3、纯小数的补码:
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。
以-0.64为例,其原码为1.1010_0011_1101_0111b
则补码为:1.0101_1100_0010_1001b
当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。
4、一般带小数的补码
一般来说这种情况下先转为整数运算比较方便
-97.64为例,经查询其原码为1110_0001.1010_0011_1101_0111b
笔算过程:
-97.64*2^16=-6398935=1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。
则其补码为1001_1110_0101_1100_0010_1001b,在此采用负数的补码={原码符号位不变}+{数值位按位取反后+
如果你还想了解更多这方面的信息,记得收藏关注本站。
本文链接:http://www.xinin56.com/ruanjian/5544.html