C语言【微项目08】—原码一位乘乘法器[逻辑右移与加法运算组合](采用原码一位乘计算原理实现)
【TDTX】
【注1】不能输入负数参与运算,因为只有正数的补码是其原码。
【注2】由于正数的原码就是其补码,因此计算机中存储的正数补码就可以视作原码参与计算。
【注3】由于使用的是int 类型(32)位,因此,两个int类型相乘,结果应该是64位二进制,显然在一个int 变量中放不下。然而,由于原码一位乘的计算原理,所得结果,刚好分为两部分,各长32位,所以就用两个int变量存放,res存放高32位,b存放低32位即可。
【注4】本文还介绍了一种提取变量二进制数每位是1还是0的方法:如果是要提取一个32位二进制数,那么在计算机中由于是补码形式存放,因此可以使用t = -2147483648;//t:1000 0000 0000 0000 0000 0000 0000 0000来跟这个被提取数做按位与(&),即可判断最高位是1还是0,接下来只需将被提数取左移一位再按位与(&),这一流程重复执行32次即可。
OriCodeOneBitMult.c
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int a0 = a,b0 = b;
printf("检查:a:%#X,b:%#X\n",a,b);
int co = 0;
int res = 0;
puts("由于正数的原码就是其补码,因此以下计算机中存储的正数补码视作原码参与计算:");
for(int i = 1;i <= sizeof(int)*8;i++)
{
puts("-----------------------------------------------------------------");
if((b & 1) == 1)
{
//若b的最低位是1,则res加上a
printf("<1>%d:res = %#X--",res,res);
res = res + a;
printf("<2>%d:res + a = %#X\n",res,res);
}
else
{
//若b的最低位是0,则res加上0
printf("<1>%d:res = %#X--",res,res);
res = res + 0;
printf("<2>%d:res + 0 = %#X\n",res,res);
}
printf("<1>%d:b = %#X--",b,b);
b =b >> 1;
printf("<2>%d:b >> 1 = %#X\n",b,b);
co++;
if((res & 1) == 1)
{
//若res将要右移出的最低位是1,则将其放在右移后b的最高位上
printf("<1>%d:res = %#X--",res,res);
res = res >> 1;
printf("<2>%d:res >> 1 = %#X\n",res,res);
printf("<1>%d:b = %#X--",b,b);
b = b | -2147483648;//将右移后的b的最高位变为1,此1是res右移出的1
printf("<2>%d:b | -2147483648 = %#X\n",b,b);
}
else
{
//若res将要右移出的最低位是0,则将其放在右移后b的最高位上
printf("<1>%d:res = %#X--",res,res);
res = res >> 1;
printf("<2>%d:res >> 1 = %#X\n",res,res);
printf("<1>%d:b = %#X--",b,b);
b = b & 2147483647;//将右移后的b的最高位变为0,此0是res右移出的0
printf("<2>%d:b & 2147483647 = %#X\n",b,b);
}
puts("-----------------------------------------------------------------");
}
printf("\n%d乘%d的积(原码):高32位:res = %#X,低32位:b = %#X\n\n",a0,b0,res,b);
int t = 0;
int tres = res;
t = -2147483648;//t:1000 0000 0000 0000__0000 0000 0000 0000
printf("【");
for(int i = 1;i <= 32;i++,tres = tres << 1)
{
//tres = tres << 1,每次把tres向左移位,然后跟“1000 0000 0000 0000__0000 0000 0000 0000”按位&,判断最高是1还是0
//通过判断32次tres的最高位是1还是0,即可解析出res二进制每位是0还是1
if((tres & t) == t)
{
if(i != 1 && i % 4 == 1)
{
printf("_");
}
printf("1");
}
else
{
if(i != 1 && i % 4 == 1)
{
printf("_");
}
printf("0");
}
}//解析出二进制每位是0还是1
printf("】--【");
int tb = b;
for(int i = 1;i <= 32;i++,tb = tb << 1)
{
//tb = tb << 1,每次把tres向左移位,然后跟“1000 0000 0000 0000__0000 0000 0000 0000”按位&,判断最高是1还是0
//通过判断32次tres的最高位是1还是0,即可解析出b二进制每位是0还是1
if((tb & t) == t)
{
if(i != 1 && i % 4 == 1)
{
printf("_");
}
printf("1");
}
else
{
if(i != 1 && i % 4 == 1)
{
printf("_");
}
printf("0");
}
}
printf("】");
return 0;
}
运行结果示例
1.35乘100
2.5211314乘3652255
------------------------------------------------------第八次发项目类文章有点激动啊!-----------------------------------------------------
-----------------------------------------------------【C语言—微项目—自编练习】------------------------------------------------------
----------------------------------------------------------------【TDTX】-----------------------------------------------------------------