进制转换原理

二进制转十进制

二进制是计算机数据的存储形式,它是由一串0和1组成,每个二进制数转换成相应的十进制数方法为
(XnXn-1Xn-2...X3X2X1)2 = X1*2^0+X2*^1+...Xn*2^(n-1)。

二进制转八进制

利用二进制转十进制原理,从低位起将每3位二进制转为1位十进制 然后进行替换即可

二进制转十六进制

利用二进制转十进制原理,从低位起将每4二进制位转为1位十进制然后进行替换即可,不过在16进制中用 a、b、c、d、e、f 代替10、11、12、13、14、15

如何用栈实现进制转换?

如果对栈这种数据结构不熟悉的,可以先看 栈的顺序存储及实现(二)、栈的顺序存储及实现(一)

二进制转十进制

首先我们来看二进制转十进制。利用栈先进后出的原理,将输入的二进制数压入栈中,高位在最下面,低位在上面,然后进行弹栈,将弹出的数转换为相应的十进制 进行累加即可得到对应的十进制

局部代码:

 //二进制数栈SeqStack binaryStack;InitStack(&binaryStack);while (1){char num = 0;scanf("%c", &num);if (num == '\n'){break;}//压栈push(&binaryStack, num);}int i = 0;int dec = 0;//十进制数while (!IsEmptyStack(&binaryStack)){char num = 0;pop(&binaryStack, &num);dec += (num - '0')*pow(2, i);i++;}

二进制转八进制

同样是先把二进制数压栈,然后 弹栈,不过 的是 3位二进制才转为1位八进制,这样就要把转出来的八进制放到另一栈中,此时八进制数的低位在栈底,高位在栈顶,再次利用栈的先进后出的原理进行弹栈,高位先弹出来,依次进行输出 就得到相应的八进制了

局部代码:

 SeqStack binaryStack;//二进制数栈SeqStack octStack;//八进制数栈InitStack(&binaryStack);InitStack(&octStack);while (1){char num = 0;scanf("%c", &num);if (num == '\n'){break;}//压栈push(&binaryStack, num);}while (1){char num = 0;int oct = 0;//8进制数for (int i = 0; i < 3; i++){if (IsEmptyStack(&binaryStack)){break;}pop(&binaryStack, &num);oct += (num - '0')*pow(2, i);}//将八进制数压入到栈中push(&octStack, oct + '0');if (IsEmptyStack(&binaryStack)){break;}}

二进制转十六进制

和二进制转八进制一模一样,不过的是需要4位二进制位转1位十六进制,其余都是一样。

局部代码:

 SeqStack binaryStack;//二进制数栈SeqStack hexStack;//十六进制数栈InitStack(&binaryStack);InitStack(&hexStack);while (1){char num = 0;scanf("%c", &num);if (num == '\n'){break;}//压栈push(&binaryStack, num);}while (1){char num = 0;int oct = 0;//十六进制数for (int i = 0; i < 4; i++){if (IsEmptyStack(&binaryStack)){break;}pop(&binaryStack, &num);oct += (num - '0')*pow(2, i);}//将十六进制数压入到栈中if (oct<10){push(&hexStack, oct + '0');}else{push(&hexStack, oct-10 + 'a');}if (IsEmptyStack(&binaryStack)){break;}}

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 5
#define STACK_INCREMENT 5
typedef int Status;
typedef char EleType;typedef struct SeqStack
{EleType* top;//栈顶指针EleType* base;//栈底指针int stackSize;//栈容量
}SeqStack;
//初始化栈
Status InitStack(SeqStack* stack)
{//开辟空间stack->base = stack->top = (EleType*)malloc(STACK_INIT_SIZE * sizeof(EleType));if (!stack->base){exit(0);}return OK;
}
//压栈
Status push(SeqStack* stack, EleType e)
{if (stack == NULL){return ERROR;}//压栈之前检测容量是否足够if (stack->top - stack->base == stack->stackSize){//超出容量 进行扩容,使用realloc函数,会拷贝原内存内容stack->base = (SeqStack*)realloc(stack->base, stack->stackSize + STACK_INCREMENT);if (!stack->base){exit(0);}stack->top = stack->base + stack->stackSize;stack->stackSize += STACK_INCREMENT;}*stack->top = e;stack->top++;return OK;
}
//弹栈
Status pop(SeqStack* stack, EleType *e)
{if (stack == NULL || e == NULL){return ERROR;}//空栈if (stack->top == stack->base){return ERROR;}*stack->top--;*e = *stack->top;return OK;
}
/*
判断栈是否为空
*/
int IsEmptyStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}if (stack->top == stack->base) {return TRUE;}return FALSE;
}
/*
销毁栈
*/
Status DestroyStack(SeqStack* stack)
{if (NULL == stack) {return ERROR;}//销毁栈 是释放栈在内存中占用的空间资源if (!stack->base){free(stack->base);}stack->top = stack->base = NULL;stack->stackSize = 0;return OK;
}
//二进制 转 十进制
void BinaryToDeci()
{printf("请输入二进制:");//二进制数栈SeqStack binaryStack;InitStack(&binaryStack);while (1){char num = 0;scanf("%c", &num);if (num == '\n'){break;}//压栈push(&binaryStack, num);}int i = 0;int dec = 0;//十进制数while (!IsEmptyStack(&binaryStack)){char num = 0;pop(&binaryStack, &num);dec += (num - '0')*pow(2, i);i++;}printf("对应的十进制:%d\n", dec);DestroyStack(&binaryStack);
}
//二进制 转 八进制
void BinaryToOct()
{printf("请输入二进制:");SeqStack binaryStack;//二进制数栈SeqStack octStack;//八进制数栈InitStack(&binaryStack);InitStack(&octStack);while (1){char num = 0;scanf("%c", &num);if (num == '\n'){break;}//压栈push(&binaryStack, num);}while (1){char num = 0;int oct = 0;//8进制数for (int i = 0; i < 3; i++){if (IsEmptyStack(&binaryStack)){break;}pop(&binaryStack, &num);oct += (num - '0')*pow(2, i);}//将八进制数压入到栈中push(&octStack, oct + '0');if (IsEmptyStack(&binaryStack)){break;}}printf("对应的八进制:");while (!IsEmptyStack(&octStack)){char num = 0;pop(&octStack, &num);putchar(num);}printf("\n");DestroyStack(&binaryStack);DestroyStack(&octStack);
}
//二进制 转 十六进制
void BinaryToHex()
{printf("请输入二进制:");SeqStack binaryStack;//二进制数栈SeqStack hexStack;//十六进制数栈InitStack(&binaryStack);InitStack(&hexStack);while (1){char num = 0;scanf("%c", &num);if (num == '\n'){break;}//压栈push(&binaryStack, num);}while (1){char num = 0;int oct = 0;//十六进制数for (int i = 0; i < 4; i++){if (IsEmptyStack(&binaryStack)){break;}pop(&binaryStack, &num);oct += (num - '0')*pow(2, i);}//将十六进制数压入到栈中if (oct<10){push(&hexStack, oct + '0');}else{push(&hexStack, oct-10 + 'a');}if (IsEmptyStack(&binaryStack)){break;}}printf("对应的十六进制:");while (!IsEmptyStack(&hexStack)){char num = 0;pop(&hexStack, &num);putchar(num);}printf("\n");DestroyStack(&binaryStack);DestroyStack(&hexStack);
}//二进制 转 八进制
int main(int argc, char *argv[])
{int menu = 1;while (menu){printf("-------菜单-------\n");printf("-------1、二进制转十进制-------\n");printf("-------2、二进制转八进制-------\n");printf("-------3、二进制转十六进制-------\n");printf("-------0、退出-------\n");printf("请输入菜单:");scanf("%d", &menu);getchar();//去掉换行符 \nswitch (menu) {case 1:BinaryToDeci();break;case 2:BinaryToOct();break;case 3:BinaryToHex();break;default:menu = 0;break;}}return 0;
}

运行结果

栈应用:实现二进制转八进制、十进制、十六进制相关推荐

  1. 二进制与八进制十进制十六进制之间的转换

    目录 1. 计算机中数据存储的分类 2.        数值型数据的存储 2.1          十进制 2.2          二进制 2.3          八进制 2.4         ...

  2. 【笔记】二进制八进制十进制十六进制互转详细教程和范例

    最近复习之前的笔记基础.又把进制转换理解了一遍.放在这里以后备查.同时作为分享. 二进制转换八进制十进制十六进制 例: 11010 二进制转换八进制 需要2进制数字为每3位分组的十进制数,不足3位的倍 ...

  3. 用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序

    用'栈'的思想编写一个十进制转换二进制.八进制或十六进制的程序 根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数, ...

  4. bash 将二进制转换为十进制_用‘栈的思想编写一个十进制转换二进制、八进制或十六进制的程序...

    用'栈'的思想编写一个十进制转换二进制.八进制或十六进制的程序 根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数, ...

  5. 定义并调用函数 十进制转二进制_用‘栈的思想编写一个十进制转换二进制、八进制或十六进制的程序...

    用'栈'的思想编写一个十进制转换二进制.八进制或十六进制的程序 根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数, ...

  6. 语言栈十进制转十六进制_十进制数转二进制、八进制、十六进制等任意进制_C语言「抄作业」...

    C语言「抄作业」系列之十进制数转二进制.八进制.十六进制等任意进制 PS: 写这篇时发现了潜藏多年的Bug.在修复时,无意间发现,本大仙当年的Bug代码竟然「流传甚广」--(别以为改了下变量名,就能骗 ...

  7. 二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储

    1. Java中数字默认是十进制,二进制.八进制以及十六进制的表示如下 2. 二进制.八进制.十六进制和十进制的相互转换 2.1 为了不累赘描述,本文以百度的二进制小数转换为十进制小数为例,如下图 2 ...

  8. bytes转16进制整数 python_Python 十进制转二进制、八进制、十六进制

    以下代码用于实现十进制转二进制.八进制.十六进制: # -*- coding: UTF-8 -*- # Filename :test.py # author by :fghfhvngvgfgdh # ...

  9. 十六进制表示_教资信息技术之:十进制(正数)转二进制、八进制、十六进制...

    进制表示:二进制B:八进制O:十进制D:十六进制H 除2取余,倒序排序:除8取余,倒序排序:除16取余,倒序排序:这种方法不做赘述 一.十进制转二进制 45D--101101B 157.6875D-- ...

  10. 十进制与二进制,八进制,十六进制的转换

    (一)数制       计算机采用的是二进制,因为二进制具有运算简单,易实现且可靠,为逻辑设计提供了有利的途径,节省设备等优点,为了便于描述,又常用八.十六进制作为二进制的缩写.特点: (1)逢n进一 ...

最新文章

  1. windows10 下载 安装 使用 Sox
  2. [业界资讯]Window7下的IE8新漏洞KB973874成功修复
  3. 《中国人工智能学会通讯》——4.27 电子数据取证理论与技术
  4. Android异步加载
  5. 阿里正式取消周报:打击低效加班,拒绝形式主义!
  6. WCF从理论到实践(4):路在何方
  7. 【mongoDB运维篇③】replication set复制集
  8. MST(最小生成树)上的确定性和存在性问题
  9. Python小练习1:.txt文件常用读写操作
  10. fastify 后台_如何使用Fastify启动和运行
  11. java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap 解决方法
  12. 那些除夕夜还在上BOSS直聘的人
  13. 前端开发桌面终极工具(FastStone Capture)推荐(转)
  14. 换SSD硬盘,重装系统,一阵子忙乱
  15. Open Cube 时信魔方介绍
  16. 【71】力科PCIe 协议分析仪常见操作
  17. 华为RS技术认证,IA/IP/IE它们都要学什么?
  18. lstm 预测诗歌_预测诗歌运动
  19. Winform当移入控件时,鼠标变手的通用方法
  20. 2016阿里在线笔试Java研发附加题

热门文章

  1. 鸿蒙济判法讲义,2020-02-09《薛兆丰经济学讲义》读书笔记
  2. 确定性有穷自动机(DFA算法) 非确定性有穷自动机(NFA算法)
  3. windowswps怎么以文件形式发送_手机WPS怎么以文件形式发送
  4. c# imager让图片有圆角unity_Unity纹理-引题和单张纹理
  5. Qt文档阅读笔记-对JSON Save Game官方实例解析
  6. C++|STL学习笔记-map的属性(大小以及是否存在)
  7. mysql web界面 Linux_部署WEB项目到服务器(三)安装mysql5或者mysql8到linux服务器(Ubuntu)详解...
  8. java声明公共构造函数_确保控制器具有无参数的公共构造函数错误
  9. k2p 官方固件_继斐讯K2P之后,红米AC2100也将成一代路由器神机?
  10. wms仓储系统培训_WMS系统在仓储管理中产生的盈利