进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010
进制转换算法概念
其核心是利用栈的存储结构性质,进行数据的入栈出栈时的计算,让后将计算好的数据存入另一个栈内,最后再出栈输出。由于栈的先进后出特性,最后输出的顺序和输入的顺序是一样的。具体如上图。
栈的结构
#define ok 1
#define error 0
#define MAX_STACK_SIZE 10
#define SIZE 32
typedef int Status;
typedef char ElemType;typedef struct stack{ElemType *top;ElemType *base;int stackSize;
}Stack,*stackList; Status Pop(Stack *stack,ElemType *e){if(stack->top==stack->base)return error;stack->top--;*e=*(stack->top);*(stack->top)=0;return ok;
}Status Push(Stack *stack,ElemType e){if(stack->stackSize<=0){stack->top=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->top)return error;}stack->stackSize=MAX_STACK_SIZE; * stack->top=e;* stack->top++;stack->stackSize--;return ok;
} Status initStack(Stack *stack){stack->base=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->base)return error;int i;for(i=0;i<MAX_STACK_SIZE;i++)stack->base[i]=0;stack->top=stack->base;stack->stackSize=MAX_STACK_SIZE;return ok;}
上面的栈top,base是用指针的方式来实现的,具体的POP,PUSH代码,和初始化栈的initStack
转十进制
int toDecimal(Stack *stack){ElemType popData;//定义出栈数据缓冲区int sum=0;//总和int c=0; //位数while(Pop(stack,&popData)){int oper=popData-48;//栈中存放的是char类型数据,减去ascll码48是对应的数字sum+=oper*pow(2,c++);//相加}return sum;
}
转十六进制
//代码冗长,但思想不变。
//只不过多了一个4位判断,再转16进制的操作
ElemType * toHex(Stack *stack){ElemType popData;ElemType pop;Stack stack02;initStack(&stack02);int sum=0;int c=0;int count=0;ElemType tempData;ElemType *retData=(ElemType *)malloc(sizeof(ElemType)*SIZE); while(Pop(stack,&popData)){int oper=popData-48;sum+=oper*pow(2,c++);count++; //一个16进制位由4个二进制为构成,count用来判断是否已经pop出一个16进制位if(count==4){//当超过9时要用字母表示if(sum>9){sum=sum%9;switch(sum){case 1:tempData='a';break;case 2:tempData='b';break;case 3:tempData='c';break;case 4:tempData='d';break;case 5:tempData='e';break;case 6:tempData='f'; break; }}else{tempData=48+sum; //48是字符0的ascll码}Push(&stack02,tempData); //将得到的一个16进制数入栈count=0; //count重新计数sum=0;c=0; }}//计算剩下的不满四个位的二进制数,再一次pushif(sum!=0){tempData=48+sum;Push(&stack02,tempData);} int index=0;//将栈2中的数据依次弹出,保存在retData数组中,作为字符输出while(Pop(&stack02,&pop)){retData[index]=pop;index++;}retData[index]='\n';return retData;}
工程代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ok 1
#define error 0
#define MAX_STACK_SIZE 10
#define SIZE 32
typedef int Status;
typedef char ElemType;typedef struct stack{ElemType *top;ElemType *base;int stackSize;
}Stack,*stackList; Status Pop(Stack *stack,ElemType *e){if(stack->top==stack->base)return error;stack->top--;*e=*(stack->top);*(stack->top)=0;return ok;
}Status Push(Stack *stack,ElemType e){if(stack->stackSize<=0){stack->top=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->top)return error;}stack->stackSize=MAX_STACK_SIZE; * stack->top=e;* stack->top++;stack->stackSize--;return ok;
} Status initStack(Stack *stack){stack->base=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->base)return error;int i;for(i=0;i<MAX_STACK_SIZE;i++)stack->base[i]=0;stack->top=stack->base;stack->stackSize=MAX_STACK_SIZE;return ok;}ElemType * toHex(Stack *stack){ElemType popData;ElemType pop;Stack stack02;initStack(&stack02);int sum=0;int c=0;int count=0;ElemType tempData;ElemType *retData=(ElemType *)malloc(sizeof(ElemType)*SIZE); while(Pop(stack,&popData)){int oper=popData-48;sum+=oper*pow(2,c++);count++; //一个16进制位由4个二进制为构成,count用来判断是否已经pop出一个16进制位if(count==4){//当超过9时要用字母表示if(sum>9){sum=sum%9;switch(sum){case 1:tempData='a';break;case 2:tempData='b';break;case 3:tempData='c';break;case 4:tempData='d';break;case 5:tempData='e';break;case 6:tempData='f'; break; }}else{tempData=48+sum; //48是字符0的ascll码}Push(&stack02,tempData); //将得到的一个16进制数入栈count=0; //count重新计数sum=0;c=0; }}//计算剩下的不满四个位的二进制数,再一次pushif(sum!=0){tempData=48+sum;Push(&stack02,tempData);} int index=0;//将栈2中的数据依次弹出,保存在retData数组中,作为字符输出while(Pop(&stack02,&pop)){retData[index]=pop;index++;}retData[index]='\n';return retData;}int toDecimal(Stack *stack){ElemType popData;int sum=0;int c=0;while(Pop(stack,&popData)){int oper=popData-48;sum+=oper*pow(2,c++);}return sum;
}void inputData(Stack *stack){char check; initStack(stack);printf("输入一个二进制数(以#结束):"); scanf("%c",&check);while(check!='#'){Push(stack,check);scanf("%c",&check); }getchar();}int main(int argc, char *argv[]) {int choice;printf("--------------------二进制转换工具----------------------\n\n");printf("作者:changlon\n");printf("时间: 2019-12/19\n\n");printf("--------------------------------------------------------\n");do{Stack stack;inputData(&stack);printf("请选择操作\n\n");printf("0.退出\n");printf("1.转十进制\n");printf("2.转十六进制\n\n");printf("选项:");int decimal;char *ret;scanf("%d",&choice);switch(choice){case 1:decimal=toDecimal(&stack);printf("%d\n\n",decimal);break;case 2:ret=toHex(&stack);printf("%s\n\n",ret);free(ret);break; }}while(choice!=0);system("pause");return 0;
}
进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010相关推荐
- 按键精灵脚本转换成c语言,问一个关于按键码转换的问题
MessageBox "鼠标指向窗口浏览区域后,按回车键" Hwnd = Plugin.Window.MousePoint() Call Plugin.Bkgnd.KeyPress ...
- 进制转化(c 语言实现)
部分进制转化(c 语言实现) 文章目录 二进制转化为其他进制数 十进制数转化为二进制数 一.二进制转化为其他进制数 因为我们要将二进制数转化为其他进制数,所以第一步就是要确保输入的值为二进制数. ...
- c语言中如何将字符串转成16进制,用c语言写一个函数把十进制转换成十六进制,该如何处理...
用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...
- 多种进制转化 C/C++语言
多种进制转化 C/C++语言 二进制转十六进制法: C语言代码如下: #include<stdio.h> #include<string.h> int main(){int N ...
- 16进制转2进制的代码C语言
16进制转2进制的代码C语言 #include <stdio.h> void main( void ) { unsigned int i, j, num, Num[20]; char St ...
- c语言的十进制转十六进制字符串,用c语言写一个函数把十进制转换成十六进制,该如何处理...
用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...
- 用C语言实现一个简单的一元线性回归算法
今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...
- 用C语言实现一个简单的计算器代码
#include <stdio.h> #include <math.h> #include <stdlib.h> //预处理指令 int main(void) {d ...
- c语言写一个简单的小游戏-推箱子
在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...
最新文章
- Wordpress 加入html等文件
- JAVA JVM原理详解
- java.util.concurrent介绍【转】
- hdu 4496 并查集 逆向 并查集删边
- 前端学习(982):jquery概述
- 2020年母婴消费洞察报告
- 产品经理如何应对一句话需求
- 云原生数据中台的 What、Why、Who、How和Where
- Lync Server 2010企业版系列PART7:部署前端
- 西威驱动板PV33-4 电源驱动板图纸 37千瓦左右基本一样 文件发送非实物
- 浪曦大型企业门户综合项目的设计、实施与管理实地培训班隆重开班招生中……
- python源文件的扩展名是什么_python源文件后缀是什么
- 合工大计算机系汪教授,合肥工业大学计算机与信息学院导师介绍:洪日昌
- 同时虚拟多个3D桌面
- Win10锁屏壁纸文件夹Assets无文件问题的解决方法
- UE:无法解析的外部符号 “public: __cdecl FKey::~FKey(void)“ (??1FKey@@QEAA@XZ)
- mysql最左前缀概念_mysql查询优化之目录类型、最左前缀
- 一文搞懂“网络协议”
- 《红色警戒2·尤里复仇》-第四章 随地建设
- 扑克牌顺子java_算法练习篇之:扑克牌顺子
热门文章
- 机动车辆保险反欺诈的大数据智能化研究
- 全球绿色建筑的 10 个最酷的例子
- 亚新联创 2011.9.17招聘会笔试题目
- ZLMediaKit在windows平台下的编译和运行
- NE40E/NE80E 端口镜像抓包
- 2022-2028全球及中国自助终端系统(SSTS)行业研究及十四五规划分析报告
- 互联网大会2017-防范通讯信息诈骗有感
- 【BDTC 2016】工业大数据助力中国制造 帮助企业降本增收
- [附源码]SSM计算机毕业设计高校流动党员信息管理系统JAVA
- Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法颜色、光照与材质