IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言【微项目08】—原码一位乘乘法器[逻辑右移与加法运算组合](采用原码一位乘计算原理实现)【2021-11-21】 -> 正文阅读

[数据结构与算法]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】-----------------------------------------------------------------

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:35:49  更:2021-11-22 12:36:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:45:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码