转眼间,距离上一次写博客已过去了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语言实现原码一位乘法相关推荐

  1. 加减法、原码一位乘法、Booth算法、恢复余数法、加减交替法符号位及小结

    在学习计算机组成原理的计算方法时,或为步骤疑惑,或为题目难倒,本文主要介绍思路以及对常用类型小结 个人总结,仅供参考,能力有限,难免出错,欢迎大家讨论,书籍参考唐朔飞版<计算机组成原理> ...

  2. 【计算机组成原理】定点乘法运算之原码两位乘法

    讨论x * y = z 采用原码两位乘法,已知x和y,如何求得z 原码两位乘法和原码一位乘法一样,符号位不参加运算 部分积和被乘数x均采用三位符号,乘数y末位每次要加一个c,c一开始是0 根据如下法则 ...

  3. 定点乘法运算之原码一位乘法

    x * y = z 讨论已知x和y的情况下,怎么通过原码一位乘法方法得出z~~ 首先说下运算规则~ 1. z的符号位通过x和y的符号位进行异或运算得到~(这个很好理解哒,负负得正,正正得正,正负得负嘛 ...

  4. 原码一位乘法(2020-03-27)

    原码一位乘法 我直接上例子吧,说实话我看书上的定义过程,我个憨憨不懂.

  5. 一位原码的乘法规则_原码一位乘法与补码一位乘法

    原码1位乘法 在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到.而乘积的数值部分则是两个正数相乘之积.设n位被乘数和乘数用定点小数表示(定点整数也相同适用) 被 ...

  6. [计算机组成原理]2-8、定点数原码一位乘法

    前言 在学习定点数的原码一位乘法之前,我们要知道我们在学的是什么,定点数的原码乘法其实完全用十进制的乘法规则来计算,只需要将逢十进一改为逢二进一即可: 既然我们都知道定点数的原码乘法了,我们为什么还要 ...

  7. 计算机组成原理 原码一位乘法(C语言实现)

    #include<stdio.h>int Binary_add(int* Binary1,int* Binary2)//自定义的用于辅助的紧耦合函数,用于实现本题中二进制的加法运算 {in ...

  8. 2.2.2 .6定点数的乘法运算-1原码一位乘法

    XYXZNB哈哈哈哈(๑•̀ㅂ•́)و✧买!୧(﹒︠ᴗ﹒︡)୨ 加法移位运算如何实现,那这小节中我们要学习定点数的源码乘法如何实现,那由于今天窗外的雨下的很大,所以可能会有一些雨声的录入好的,那这个小 ...

  9. 计算机组成原理之原码一位乘法过程

    部分积 乘数 说明 0.0000 + ..0.1110 1101 初始条件,部分积为0 乘数为1 加被乘数 0.1110 0.0111 +. 0.0000 0110 右移一位,形成新的部分积,同时乘数 ...

  10. 组成原理---补码加减法,原码一两位乘法,补码一两位乘法,754标准

    翻转课堂,学生讲课,笔记顺便贴上来吧. 万一有人需要呢. 这里754标准其实可以看https://blog.csdn.net/xingqingly/article/details/18981671,我 ...

最新文章

  1. 使用GZIPInputStream和GZIPOutputStream压缩、解压java对象
  2. 解读ADC采样芯片(EV10AQ190A)的工作模式(四通道模式)
  3. 13行代码AC_Justifying the Conjecture Gym - 102394J(解题报告)
  4. 联想e52进入bios_联想笔记本怎么设置u盘启动|联想笔记本bios设置usb启动步骤
  5. atitit。wondows 右键菜单的管理与位置存储
  6. Orleans解决并发之痛(五):Web API
  7. JVM 学习三:类加载器
  8. 腾讯否认微信测试语音消息进度调节​;监证会同意蚂蚁集团科创板IPO注册;React 17 正式版发布|极客头条
  9. xml和TreeView
  10. JavaScript基础视频教程总结(011-020章)
  11. Android 分贝测试仪功能,挥泪整理面经
  12. 为什么开发人员都看不起运维工程师?
  13. jpeg怎么转换成jpg格式?三步学会在线jpeg转jpg
  14. 五十二 温柔一刀(下)
  15. 文献综述是什么,该怎么写?
  16. 【通信】Matlab实现多同步压缩变换
  17. 4 款超级好用的终端文件管理器,提高你的使用效率!
  18. 何为挂载(mount)?
  19. 林下仿野生天麻的种植技术方法
  20. 如何提升语音识别技术的识别能力?

热门文章

  1. 物联网服务器搭建资料汇总借用原作者
  2. 索尼相机手机控制对焦,摄影新手必看—关于索尼微单的15条技巧分享
  3. hls解密key获取失败_请求帮助。M3U8里的加密key无法下载。
  4. 计算机机房配电线路图cad,配电线路图cad怎么画
  5. 率辉c语言,C语言真题
  6. 规范名称:汽车转向设计规范(齿轮齿条)
  7. 地表反射率、温度以及植被指数的计算
  8. C语言定时器按键消抖程序,按键消抖方法(中断与定时器配合使用)
  9. cfd计算机模拟,CFD软件数值模拟分析(中联智泵)
  10. 08 计算机视觉-opencv直方图与傅里叶变换