C语言实现原码一位乘法
转眼间,距离上一次写博客已过去了10个多月,学业进度也到了大二下学期。
感慨颇多,选择了计算机这个专业,随着对所学课程的了解逐渐深入,愈发觉得经验匮乏。
又开始写博客了,打算把平时计组原理有些难度的习题整理一下,也算是记录下学习历程。
如若有同僚也正在思考这个问题,看完这篇帖子应该会有所帮助。
今天的题是:用C实现原码一位乘法
要求:不能用*,/运算符;不能用除scanf,printf以外的函数。
输出格式:
输出A*B的值,如果乘积为+正,直接输出二进制结果;如果乘积为负,输出负号及二进制结果。
输入样例:
在这里给出一组输入。例如:
34 -4
+35 5
0 0
-987654 1234567
输出样例:
-10001000
10101111
0
-10001101111100101011011111000010100101010
话不多说,见代码
#include<stdio.h>
#include<math.h>
int main(){int n1,n2;//输入数据n1,n2 scanf("%d %d",&n1,&n2);if((n1>0&&n2<0)||(n1<0&&n2>0)){printf("-");}if(n1==0||n2==0){printf("0");}else{int a[64]={0}; //数组a,用于存n1转化为二进制后的原码 int b[64]={0};//数组b,用来存n2转化为二进制后的原码 int c[64]={0};//数组c,用来存n1*n2转化为二进制的原码 n1=abs(n1);n2=abs(n2);int num1=0,num2=0; /*num1,num2用来计算n1,n2,转化为二进制后的码位,如4二进制:100,对应码位:3 (PS:这里的“码位”是笔者自己编的,不要混淆了)*/while(n1>0||n2>0){if(n1>0){if(n1%2!=0){a[num1]=1;}n1=n1>>1;num1++;}if(n2>0){if(n2%2!=0){b[num2]=1;}n2=n2>>1;num2++;}}int i,i2,j; //循环变量 int k; //c数组的指针 for(int i=0;i<num1;i++){k=i;for(int j=0;j<num2;j++){ c[k]=c[k]+(a[i]&b[j]);if(c[k]>1){c[k]=c[k]%2; //用数组进行乘运算 c[k+1]++;}k++;}}/*c数组在计算中有可能会进位,例如:a:(11111)2*b:(111)2 a码位:5,b码位:3 若结果未进位,结果码位应为:5+2=7 对应数组中:0~6但是,结果进位了,111111111110111011111111011001 此时结果码位为:8,对应数组0~7 (PS:这里的“码位”是笔者自己编的,不要混淆了) */ i2=num1+num2-1; //i2指向进位位 if(c[i2]==0){i2=i2-1; /*判断是否进位:指针先指向进位位,如果进位位为0,说明没有进位,指针前移一位 */} //循环打印结果。解题思想:参考《计算机组成原理》第70页for(;i2>=0;i2--){printf("%d",c[i2]);}}return 0;
}
这里说下在做这道题时遇到的问题:
即使能用乘除号,在大数运算时如:-987654 1234567
会溢出,造成结果为正数的情况,有关解决大数相乘的问题,参考这篇帖子:
大数 乘法 C语言_-纸短情长的博客-CSDN博客_大数乘法c语言 。
PS:上面的代码避免了溢出的问题,不必担心运行时出错。
好了,这次的分享就到这了,欢迎各位同僚在评论区发表见解或提出问题。
菜鸟程序员一枚,如若帖子内容有错误,烦请读者斧正。
C语言实现原码一位乘法相关推荐
- 加减法、原码一位乘法、Booth算法、恢复余数法、加减交替法符号位及小结
在学习计算机组成原理的计算方法时,或为步骤疑惑,或为题目难倒,本文主要介绍思路以及对常用类型小结 个人总结,仅供参考,能力有限,难免出错,欢迎大家讨论,书籍参考唐朔飞版<计算机组成原理> ...
- 【计算机组成原理】定点乘法运算之原码两位乘法
讨论x * y = z 采用原码两位乘法,已知x和y,如何求得z 原码两位乘法和原码一位乘法一样,符号位不参加运算 部分积和被乘数x均采用三位符号,乘数y末位每次要加一个c,c一开始是0 根据如下法则 ...
- 定点乘法运算之原码一位乘法
x * y = z 讨论已知x和y的情况下,怎么通过原码一位乘法方法得出z~~ 首先说下运算规则~ 1. z的符号位通过x和y的符号位进行异或运算得到~(这个很好理解哒,负负得正,正正得正,正负得负嘛 ...
- 原码一位乘法(2020-03-27)
原码一位乘法 我直接上例子吧,说实话我看书上的定义过程,我个憨憨不懂.
- 一位原码的乘法规则_原码一位乘法与补码一位乘法
原码1位乘法 在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到.而乘积的数值部分则是两个正数相乘之积.设n位被乘数和乘数用定点小数表示(定点整数也相同适用) 被 ...
- [计算机组成原理]2-8、定点数原码一位乘法
前言 在学习定点数的原码一位乘法之前,我们要知道我们在学的是什么,定点数的原码乘法其实完全用十进制的乘法规则来计算,只需要将逢十进一改为逢二进一即可: 既然我们都知道定点数的原码乘法了,我们为什么还要 ...
- 计算机组成原理 原码一位乘法(C语言实现)
#include<stdio.h>int Binary_add(int* Binary1,int* Binary2)//自定义的用于辅助的紧耦合函数,用于实现本题中二进制的加法运算 {in ...
- 2.2.2 .6定点数的乘法运算-1原码一位乘法
XYXZNB哈哈哈哈(๑•̀ㅂ•́)و✧买!୧(﹒︠ᴗ﹒︡)୨ 加法移位运算如何实现,那这小节中我们要学习定点数的源码乘法如何实现,那由于今天窗外的雨下的很大,所以可能会有一些雨声的录入好的,那这个小 ...
- 计算机组成原理之原码一位乘法过程
部分积 乘数 说明 0.0000 + ..0.1110 1101 初始条件,部分积为0 乘数为1 加被乘数 0.1110 0.0111 +. 0.0000 0110 右移一位,形成新的部分积,同时乘数 ...
- 组成原理---补码加减法,原码一两位乘法,补码一两位乘法,754标准
翻转课堂,学生讲课,笔记顺便贴上来吧. 万一有人需要呢. 这里754标准其实可以看https://blog.csdn.net/xingqingly/article/details/18981671,我 ...
最新文章
- 使用GZIPInputStream和GZIPOutputStream压缩、解压java对象
- 解读ADC采样芯片(EV10AQ190A)的工作模式(四通道模式)
- 13行代码AC_Justifying the Conjecture Gym - 102394J(解题报告)
- 联想e52进入bios_联想笔记本怎么设置u盘启动|联想笔记本bios设置usb启动步骤
- atitit。wondows 右键菜单的管理与位置存储
- Orleans解决并发之痛(五):Web API
- JVM 学习三:类加载器
- 腾讯否认微信测试语音消息进度调节​;监证会同意蚂蚁集团科创板IPO注册;React 17 正式版发布|极客头条
- xml和TreeView
- JavaScript基础视频教程总结(011-020章)
- Android 分贝测试仪功能,挥泪整理面经
- 为什么开发人员都看不起运维工程师?
- jpeg怎么转换成jpg格式?三步学会在线jpeg转jpg
- 五十二 温柔一刀(下)
- 文献综述是什么,该怎么写?
- 【通信】Matlab实现多同步压缩变换
- 4 款超级好用的终端文件管理器,提高你的使用效率!
- 何为挂载(mount)?
- 林下仿野生天麻的种植技术方法
- 如何提升语音识别技术的识别能力?