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】-----------------------------------------------------------------

posted @ 2021-11-23 14:37  TDTX  阅读(570)  评论(0编辑  收藏  举报