C语言【微项目08】—原码一位乘乘法器[逻辑右移与加法运算组合](采用原码一位乘计算原理实现)【2021-11-21】

C语言【微项目08】—原码一位乘乘法器[逻辑右移与加法运算组合](采用原码一位乘计算原理实现)【2021-11-21】


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

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值