当前位置: 首页 > news >正文

C语言实现原码一位除

具体代码如下,直接运行即可。

#include <stdio.h>
int main()
{int i, a = 0, b = 0, c = 0, flag = 3; // flag相当于指针来指明Q的位置char x[6], y[6];int R[6], Q[6], yb[6], y1[6]; // yb是-y的补码,y1为绝对值yprintf("请输入X(带一位符号位四位数值位的二进制数,如+1011):");scanf("%5s", x); while ((c = getchar()) != '\n' && c != EOF); // 清除缓冲区中的剩余字符printf("请输入Y(带一位符号位四位数值位的二进制数,如-1101):");scanf("%5s", y); // printf("X=%s\n",x);// printf("Y=%s\n",y);y1[0] = 0; // 绝对值y一定是正的,符号位为0for (i = 4; i >= 1; i--){if (y[i] == '1'){ // 将字符型的y变成int型的绝对值yy1[i] = 1;}elsey1[i] = 0;}// printf("y的绝对值y1:");// for (i = 0; i <= 4; i++)// {// 	printf("%d", y1[i]);// }// printf("\n");if (x[0] == '+'){a = 0;x[0] = '0'; // 符号位计算}else // 这里我怀疑是有点问题,先加个大括号先,出问题再删{	a = 1;x[0] = '1';}if (y[0] == '+'){b = 0;y[0] = '0';}else // 这里我怀疑是有点问题,先加个大括号先,出问题再删{	b = 1;y[0] = '1';}if (a + b == 1) //只有一个1一个0,异号的时候才结果为负{c = 1;}elsec = 0; // c为符号位yb[0] = 1;for (i = 4; i >= 0; i--){ //-y的补码计算if (y1[i] == 1) //!!!我这里把y改成了y1yb[i] = 0; // 取反//我这里不取反试试// yb[i] = 1;elseyb[i] = 1;//我这里不取反试试// yb[i] =0;}// printf("y1取反后的值:");// for (i = 0; i <= 4; i++)// {// 	printf("%d", yb[i]);// }// printf("\n");yb[4] = yb[4] + 1; // 末尾加一for (i = 4; i > 0; i--){if (yb[i] == 2){ // 满2进一位yb[i] = 0;yb[i - 1] += 1;}if (yb[i] == 3){ // 满3进一位 且留下1yb[i] = 1;yb[i - 1] += 1;}}// printf("-y1的补码yb为:");// for (i = 0; i <= 4; i++)// {// 	printf("%d", yb[i]);// }// printf("\n");for (i = 4; i >= 0; i--){Q[i] = 0; // 给Q赋初值}R[0] = 0; // 设置余数for (i = 4; i >= 1; i--){ // 给R做初始化if (x[i] == '1')R[i] = 1;elseR[i] = 0;}// printf("R的初始值:"); // 余数符号位为0 数值位为x的值// for (i = 0; i <= 4; i++)// {// 	printf("%d", R[i]);// }// printf("\n");while (flag >= 1){ // 当flag=1时相当于全部除完if (flag == 1){ // 最后一步不移位  单独提出来for (i = 4; i >= 0; i--){ // 余数R加上-y的补码R[i] += yb[i];if (R[i] == 2){ // 满2进一位R[i] = 0;R[i - 1] += 1;}if (R[i] == 3){ // 满3进一位 且留下1R[i] = 1;R[i - 1] += 1;}}if (R[0] == 1){ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0Q[4] = 0;}elseQ[4] = 1;break;}for (i = 4; i >= 0; i--){ // 余数R加上-y的补码R[i] += yb[i];if (R[i] == 2){ // 满2进一位R[i] = 0;R[i - 1] += 1;}if (R[i] == 3){ // 满3进一位 且留下1R[i] = 1;R[i - 1] += 1;}}if (R[0] == 1){ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0Q[4] = 0;flag -= 1; // 向左移动一位for (i = 4; i >= 1; i--){R[i] += y1[i];if (R[i] == 2){ // 满2进一位R[i] = 0;R[i - 1] += 1;}if (R[i] == 3){ // 满3进一位 且留下1R[i] = 1;R[i - 1] += 1;}} // 不够减先恢复余数再左移for (i = 0; i <= 3; i++){ // 左移R[i] = R[i + 1];}//!!! 这里应该是逻辑左移的,所以我重新设为0// R[4] = Q[0]; // 将Q的第一个移动给RR[4] = 0 ;for (i = 0; i <= 3; i++){ // 左移Q[i] = Q[i + 1];}} // 恢复后R[0]符号位又变成了0else{			   // 够减直接左移Q[4] = 1;  // 够减Q为1flag -= 1; // 向左移动一位for (i = 0; i <= 3; i++){ // 左移R[i] = R[i + 1];}//!!! 还是逻辑左移设为0// R[4] = Q[0]; // 将Q的第一个移动给RR[4] = 0;for (i = 0; i <= 3; i++){ // 左移Q[i] = Q[i + 1];}}}printf("商Q的值:");for (i = 0; i <= 4; i++){printf("%d", Q[i]);}printf("\n");printf("余数R的值:0.000");for (i = 0; i <= 4; i++){printf("%d", R[i]);}printf("\n");printf("X/Y=%d.", c);for (i = 1; i <= 4; i++){printf("%d", Q[i]);}printf("\n");return 0;
}
http://www.lryc.cn/news/221915.html

相关文章:

  • three.js点滴yan(整理后)
  • VMware安装CentOS最小化开发环境导引
  • 服务器端编程/数据库驱动程序/RESTful API:介绍
  • Qwt QwtThermo绘制温度计
  • U_boot介绍
  • Flink -- window(窗口)
  • 原语:串并转换器
  • 没网络也能安装.Net 3.5!如何脱机安装.NET Framework 3.5
  • JVM运行时数据区-虚拟机栈
  • Java中介者模式
  • 前端框架Vue学习 ——(五)前端工程化Vue-cli脚手架
  • App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
  • Spring -Spring之依赖注入源码解析
  • Spire.Office for .NET 8.10.2 同步更新-Crk
  • MFC 基础篇(一)
  • Android技术-修改SO导出符号
  • flutter 打包apk
  • Halcon如何使用SaperaLT库连接dalsa相机
  • Vue 嵌套路由 多级路由规则
  • pandas教程:Introduction to pandas Data Structures pandas的数据结构
  • MinIO 分布式文件(对象)存储
  • HTML表单标签
  • 【黑马程序员】SpringCloud——Eureka
  • 目标跟踪(DeepSORT)
  • 2 任务2: 使用趋动云GPU进行猫狗识别实践
  • 技术分享 | app自动化测试(Android)--显式等待机制
  • 机器学习基础之《回归与聚类算法(5)—分类的评估方法》
  • 如何在macbook上删除文件?Mac删除文件的多种方法
  • Java代码Demo——Map根据key或value排序
  • 一个Linux自动备份脚本的示例