转眼间,距离上一次写博客已过去了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. 细说Android 4.0 NDK编程pdf
  2. Android AsyncTask用法介绍
  3. C++描述杭电OJ 2018.母牛的故事 ||
  4. spring boot—自定义logback日志配置
  5. 佳能2525i扫描驱动_您需要扫描仪整合工具吗?来试试ExactScan Pro for mac
  6. VMware安装系统时“无法创建新虚拟机: 不具备执行此操作的权限“的解决方案
  7. java从文件读入个人信息_Nacos 作为配置中心 读取Properties配置信息
  8. C++ Web编程实战
  9. 嵌入式c语言小学期实验报告,小学期单片机实验报告.doc
  10. ecshop+ectouch LANP伪静态
  11. 家庭计算机上网必须用到的设备,家庭网络中常见的几种网络设备介绍
  12. 中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程
  13. 腾讯云技术分享:MySQL AHI 实现解析
  14. sqlserver数据库的使用
  15. keras使用load_weights遇到报错
  16. mysql 连续天数_mysql计算连续天数,mysql连续登录天数,连续天数统计
  17. C#腾讯地图Web端定位地址搜索及手机导航
  18. linux双系统如何选择顺序,Ubuntu和Windows双系统选择开机顺序
  19. 14z app测试方法与技术 -软件测试
  20. 热插拔机制之udev和mdev

热门文章

  1. 鸿蒙系统屏幕录制,鸿蒙系统游戏性能出色;三星折叠屏发布屏下摄像头
  2. mac编译linux开源软件,Mac 端超好用的免费开源软件,我推荐这几款
  3. #Qt#QListView的两种用法,亲测有效
  4. js封装倒计时函数实现倒计时效果
  5. 进阶篇: ramdump分析--9 ram dump文件种类
  6. Python实现简单命令行版《中国象棋》不使用第三方库
  7. python求最值_Python应用:python求极值点(波峰波谷)
  8. 电子技术基础(三)__第5章 之逻辑门符号
  9. python for spss statistics_SPSS Statistics功能介绍
  10. 不同尺度下耕地土壤Cr含量的空间自相关性分析