源码乘法运算如何相加(乘法换算加法的讲解)
本文目录一览:
- 1、计算机中二进制的乘法和除法如何用加法来实现的
- 2、原码一位乘法中部分积如何相加
- 3、求助C语言的“大整数加法和乘法”! 求源代码!希望尽可能使用简单的语句!谢谢!
- 4、原码二位乘法100为什么是加2x?
计算机中二进制的乘法和除法如何用加法来实现的
计算机的乘法是"移位"-"相加"。举例来说:1010*0011=?
a=1010; b=0011。那个是乘数,那个是被乘数都没关系,不加区别;
先看b的最高位,=0,则移位a,并乘以0;次高位=0,同理,...
得出四个数,分别是0000,0000,1010,1010。我们按顺序相加:
0 x1010=0000最高位:0000---(千位移三位)
0 x1010=0000次高位:-0000--(百位移两位)
1 x1010=1010次低位:--1010-(十位移一位)
1 x1010=1010最低位:---1010(个位不移位)
--------------------------------------------------------
结果是:------------------0011110
(看到最左侧了么?从高到低就是0011)
即:a=10(十进制),b=3(十进制),结果=30(十进制),就是二进制的0011110=0x1E(十六进制)。其中包含一个重要的硬件:列向错位加法器7个,一个横向加法器(结果寄存器);
致于除法,就用移位减法的办法来实现的,原理与乘法相通。不够减后就停止,得出余数。
原码一位乘法中部分积如何相加
原码一位乘法:在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运而乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数用定点小数表示:被乘数
[x]原
=
xf
.x0
x1
x2
„
xn
乘数
[y]原
=
yf
.y0
y1
y2
„
yn
则乘积
[
z
]原
=
(
xf⊕yf
)
.
(0.
x0
x1
x2
„xn)(0
.
y1
y2
„yn)
式中,xf为被乘数符号,yf为乘数符号。乘积符号的运算法则是:同号相乘为正,异号相乘为负。由于被乘数和乘数和符号组合只有(xf
yf
=
00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。数值部分的运算方法与普通的十进制小数乘法相类似,不过对于用二进制表达的数来说,其更为简单一些:从乘法y的最低位开始,若这一位为“1”,则将被乘数x写下;若这一位为“下全0。然后再对乘数y的高一位进行的乘法运算,其规则同上,不过这一位乘数的权与最低位不一样,因此被乘数x要左移一位。依次类推,直到乘数各位乘完为止,最后将它们统统加起来最后乘积z
。
求助C语言的“大整数加法和乘法”! 求源代码!希望尽可能使用简单的语句!谢谢!
#includeiostream //大整数的加、减、乘
#includestring
using namespace std;
const int SIZE=200; //声明常量SIZE(赋常数200)
struct hgint //自定义结构体类型hgint
{ //定义该结构体各成员变量
int len, // len表示大整数的位数;
num[SIZE]; // num[1]表示个位,num[2]表示十位,以此类推
};
hgint add(hgint a,hgint b) //子函数add计算a+b
{
int i;
hgint ans; //定义ans为hgint类型
memset(ans.num,0,sizeof(ans.num)); //将数组元素清0
if(a.lenb.len)
ans.len=a.len;
else
ans.len=b.len;
for(i=1;i=ans.len;i++)
{
ans.num[i]+=a.num[i]+b.num[i];
ans.num[i+1]+=ans.num[i]/10;
ans.num[i]%=10;
}
if(ans.num[ans.len+1]0)
ans.len++;
return ans;
}
hgint Subtraction(hgint a,hgint b) //子函数Subtraction计算a-b
{
int i;
hgint ans;
memset(ans.num,0,sizeof(ans.num));
if(a.lenb.len)ans.len=a.len;
else ans.len=b.len;
for(i=1;i=ans.len;i++)
{
ans.num[i]=a.num[i]+10-b.num[i];
a.num[i+1]=a.num[i+1]-1+ans.num[i]/10;
ans.num[i]%=10;
}
if(ans.num[ans.len+1]0)ans.len++;
return ans;
}
hgint Multiplication(hgint a,hgint b) //子函数Multiplication计算a*b
{ int n,i,j;
hgint ans;
memset(ans.num,0,sizeof(ans.num));
for(i=1;i=b.len;i++)
{ n=0;
for(j=1;j=a.len;j++)
{ ans.num[i+j-1]=ans.num[i+j-1]+a.num[j]*b.num[i]+n;
n=ans.num [i+j-1]/10;
ans.num[i+j-1]=ans.num[i+j-1]%10;
}
ans.num [i+j-1]=n;
}
for(i=SIZE-1;ans.num[i]==0;i--);
ans.len=i;
return ans;
}
int main( )
{
string s; //定义s为string类型
int i; //定义i为int类型
hgint s1,s2,ss; //定义s1,s2,ss为hgint类型
cout" s1=";cins;
memset(s1.num,0,sizeof(s1.num)); //将数组元素清0
s1.len=s.length();
for(i=1;i=s1.len;i++)
s1.num[i]=s[s1.len-i]-48;
for(i=SIZE-1;s1.num[i]==0;i--);
s1.len=i;
cout" s2=";cins;
memset(s2.num,0,sizeof(s2.num));
s2.len=s.length();
for(i=1;i=s2.len;i++)
s2.num[i]=s[s2.len-i]-48;
for(i=SIZE-1;s2.num[i]==0;i--);
s2.len=i;
memset(ss.num,0,sizeof(ss.num));
ss=add(s1,s2); //s1+s2
cout"\n s1+s2=";
for(i=ss.len;i=1;i--)
coutss.num[i];
memset(ss.num,0,sizeof(ss.num));
ss=Subtraction(s1,s2); //s1-s2
cout"\n s1-s2=";
for(i=ss.len;i=1;i--)
coutss.num[i];
memset(ss.num,0,sizeof(ss.num));
ss=Multiplication(s1,s2); //s1*s2
cout"\n s1*s2=";
for(i=ss.len;i=1;i--)
coutss.num[i];
cout"\n";
system("pause");
return 0;
}
本人联系方式:zqy-163@qq.com
原码二位乘法100为什么是加2x?
题主断章取义了,书上写:根据“100”加2x*。
这句话是有语境的,这里的100,前面的10是乘数的低位(最右),后面的0是标志位Cj。
什么是Cj呢?根据原码两位乘法的规则就能知道:
当乘数两位状态为11时,需要加上3倍被乘数,这在计算机中不好直接实现。所以改成加上(4-1)倍被乘数。但这么规定后,两位乘数最大值只有11,也就是3。所以增加一个标志位Cj,当Cj为1时,给两位乘数加上一个“1”。
运算时就可以看成:加上“乘数的两位+Cj”倍的被乘数。
再回到:根据“100”加2x* 这句话
这里的100实际上就是(10+0),结果还是10,所以加2x*。
而Cj何时为0何时为1,看书上原码两位乘的运算规则表就可以了