栈——进制转换
2013-05-30 11:14
183 查看
从二进制到八进制
地球人都知道,我们学习编程常常会接触到不同进制的数,而最多的就是二进制、八进制、十进制、十六进制。鱼C人还知道,二进制是计算机唯一认识的,十进制是人们通常使用的。
那么,有没有谁知道八进制和十六进制呢?为什么没有三进制、四进制、五六七进制呢?
(⊙v⊙)嗯,我们仔细观察二进制跟十六进制的对应关系:
二进制跟十六进制
可见一个字节(8bit)刚好用两个十六进制数可以表示完整,也大大的节省了显示空间。
那八进制呢?因为早期的计算机系统都是三的倍数,所以用八进制比较方便。
我们发现了,在进行二进制到八进制的转换时,要将二进制数的每三位抓换成一个八进制数来表示,然后按顺序输出即可。
对于文字描述不好理解的概念,我们就只能:
No pic you say a j8!
进制转换
进制转换
进制转换
#include <stdio.h> #include <stdlib.h> #include <math.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; void InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if( !s->base ) { exit(0); } s->top = s->base; s->stackSize = STACK_INIT_SIZE; } void Push(sqStack *s, ElemType e) { if( s->top - s->base >= s->stackSize ) { s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType)); if( !s->base ) { exit(0); } } *(s->top) = e; s->top++; } void Pop(sqStack *s, ElemType *e) { if( s->top == s->base ) { return; } *e = *--(s->top); } int StackLen(sqStack s) { return (s.top - s.base); } int main() { ElemType c; sqStack s; int len, i, sum = 0; InitStack(&s); printf("请输入二进制数,输入#符号表示结束!\n"); scanf("%c", &c); while( c != '#' ) { Push(&s, c); scanf("%c", &c); } getchar(); // 把'\n'从缓冲区去掉 len = StackLen(s); printf("栈的当前容量是: %d\n", len); for( i=0; i < len; i++ ) { Pop(&s, &c); sum = sum + (c-48) * pow(2, i); } printf("转化为十进制数是: %d\n", sum); return 0; }
/*****************************/ /** 二进制/十六进制转换器 **/ /** By www.fishc.com 小甲鱼 **/ /*****************************/ #include <stdio.h> #include <stdlib.h> #include <math.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; // 函数功能:初始化栈 // 参数*s:栈的地址 void InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if( !s->base ) { exit(0); } s->top = s->base; s->stackSize = STACK_INIT_SIZE; } // 函数功能:入栈操作 // 参数*s:栈的地址 // 参数e:待压入栈的元素 void Push(sqStack *s, ElemType e) { if( s->top - s->base >= s->stackSize ) { s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType)); if( !s->base ) { exit(0); } s->top = s->base + s->stackSize; s->stackSize = s->stackSize + STACKINCREMENT; } *(s->top) = e; s->top++; } // 函数功能:弹栈操作 // 参数*s:栈的地址 // 参数e:存放从栈里弹出的数据 void Pop(sqStack *s, ElemType *e) { if( s->top == s->base ) { return; } *e = *--(s->top); } // 函数功能:计算栈s的当前长度 // 参数s:栈 int StackLen(sqStack s) { return (s.top - s.base); } int main() { ElemType c; sqStack s1; sqStack s2; int len, i, j, sum = 0; InitStack(&s1); // 初始化栈s1,用来存放二进制输入 printf("请输入二进制数,输入‘#’号表示结束!\n\n"); scanf("%c", &c); while( c != '#' ) { if( c=='0' || c=='1' ) // 检查输入是否二进制 Push(&s1, c); scanf("%c", &c); } getchar(); // 把'\n'从缓冲区去掉 len = StackLen(s1); InitStack(&s2); // 初始化栈s2,用来存放转换的八进制 for( i=0; i < len; i+=4 ) { for( j=0; j < 4; j++ ) { Pop( &s1, &c ); // 取出栈顶元素 sum = sum + (c-48) * pow(2, j); if( s1.base == s1.top ) { break; } } switch( sum ) { case 10: sum = 'A'; break; case 11: sum = 'B'; break; case 12: sum = 'C'; break; case 13: sum = 'D'; break; case 14: sum = 'E'; break; case 15: sum = 'F'; break; default: sum += 48; } Push( &s2, sum ); sum = 0; } printf("\n转化为十六进制数是: "); while( s2.base != s2.top ) { Pop( &s2, &c ); printf("%c", c); } printf("(H)\n"); return 0; }
/*****************************/ /** 二进制/八进制转换器 **/ /** By www.fishc.com 小甲鱼 **/ /*****************************/ #include <stdio.h> #include <stdlib.h> #include <math.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; // 函数功能:初始化栈 // 参数*s:栈的地址 void InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if( !s->base ) { exit(0); } s->top = s->base; s->stackSize = STACK_INIT_SIZE; } // 函数功能:入栈操作 // 参数*s:栈的地址 // 参数e:待压入栈的元素 void Push(sqStack *s, ElemType e) { if( s->top - s->base >= s->stackSize ) { s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType)); if( !s->base ) { exit(0); } s->top = s->base + s->stackSize; s->stackSize = s->stackSize + STACKINCREMENT; } *(s->top) = e; s->top++; } // 函数功能:弹栈操作 // 参数*s:栈的地址 // 参数e:存放从栈里弹出的数据 void Pop(sqStack *s, ElemType *e) { if( s->top == s->base ) { return; } *e = *--(s->top); } // 函数功能:计算栈s的当前长度 // 参数s:栈 int StackLen(sqStack s) { return (s.top - s.base); } int main() { ElemType c; sqStack s1; sqStack s2; int len, i, j, sum = 0; InitStack(&s1); // 初始化栈s1,用来存放二进制输入 printf("请输入二进制数,输入‘#’号表示结束!\n\n"); scanf("%c", &c); while( c != '#' ) { if( c=='0' || c=='1' ) // 检查输入是否二进制 Push(&s1, c); scanf("%c", &c); } getchar(); // 把'\n'从缓冲区去掉 len = StackLen(s1); InitStack(&s2); // 初始化栈s2,用来存放转换的八进制 for( i=0; i < len; i+=3 ) { for( j=0; j < 3; j++ ) { Pop( &s1, &c ); // 取出栈顶元素 sum = sum + (c-48) * pow(2, j); if( s1.base == s1.top ) { break; } } Push( &s2, sum+48 ); sum = 0; } printf("\n转化为八进制数是: "); while( s2.base != s2.top ) { Pop( &s2, &c ); printf("%c", c); } printf("(O)\n"); return 0; }
相关文章推荐
- java进制转换
- 基础 Linux 命令用法 - 使用 bc 进行简单运算与进制转换
- Java基础--数据类型及进制转换
- ZOJ 3713 In 7-bit(进制转换)
- 题目1080:进制转换
- Zzulioj 2134: 维克兹的进制转换 ( DP
- ACM 水题进制转换
- 5——进制转换
- 进制转换
- 进制转换
- 任意的进制转换
- #18 cisco设备系统操作、子网掩码与计算机的进制转换
- java 十六进制 Integer 进制转换 源码解读
- 进制转换 HDU - 2031
- 各种进制转换
- 进制转换计算方法
- 1252进制转换
- luogu1017【2000提高】进制转换(数学)
- 九度oj1080 大数的进制转换
- 【模板】进制转换【DBSDFZOJ】