十六进制转二进制转八进制
2016-03-15 16:47
387 查看
存4位-取3位方法
十六进制转二进制转八进制的思路最快的 最便于计算的
是 先转化成2进制,再转换成8进制:
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111 搜索
先每四位一组转换成2进制
例如:
3BC24
分别对应到上表 就是:
3 0011
B 1011
C 1100
4 0100
连起来就是:
0011 1011 1100 0100
再按照每三个一组分组:
0 011 101 111 000 100
对应到8进制:
(其实跟上表的前一半是一样的):
0 000 (0*4+0*2+0*1 = 0)
1 001 (0*4+0*2+1*1 = 1)
2 010 (0*4+1*2+0*1 = 2)
3 011 (0*4+1*2+1*1 = 3)
4 100 (1*4+0*2+0*1 = 4)
5 101 (1*4+0*2+1*1 = 5)
6 110 (1*4+1*2+0*1 = 6)
7 111 (1*4+1*2+1*1 = 7)
0 011 101 111 000 100
0__3__5__7__0__4
所以8进制就是35704
C语言程序的实现过程:
#include <stdio.h> #include <string.h> int eight[200000], eight_n, two[400000], two_n; char sixteen[100000]; int check() { int i; for(i = 0; sixteen[i] != '\0' && sixteen[i] != '\n'; i++) { if(sixteen[i] < '0' || (sixteen[i] > '9' && sixteen[i] < 'A') || sixteen[i] > 'Z') { printf("请输入正确的16进制数: "); return 0; } } return 1; } int sixteen_two() { int i, two_num = 0; for(i = 0; sixteen[i] != '\0' && sixteen[i] != '\n'; i++) //转为2进制字符串放在two { switch(sixteen[i]) { case '0': two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 0; break; case '1': two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 1; break; case '2': two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 0; break; case '3': two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 1; break; case '4': two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 0; break; case '5': two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 1; break; case '6': two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 0; break; case '7': two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 1; break; case '8': two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 0; break; case '9': two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 0; two[two_num++] = 1; break; case 'A': two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 0; break; case 'B': two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 1; two[two_num++] = 1; break; case 'C': two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 0; break; case 'D': two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 0; two[two_num++] = 1; break; case 'E': two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 0; break; case 'F': two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 1; two[two_num++] = 1; break; default: printf("输入错误信息\n"); } } return two_num; //返回的是二进制个数 } int two_eight(int two_num) {//把转换后的8进制逆序存入数组 int i, eight_num = 0; for(i = two_num; i >= 3; ) { eight[eight_num++] = two[--i] + two[--i] * 2 + two[--i] * 4; } if(i == 2) { eight[eight_num++] = two[--i] + two[--i] * 2; } if(i == 1) { eight[eight_num++] = two[--i]; } return eight_num; } void printf_two(int two_num) { int i; printf("2进制: "); for(i = 0; i < two_num; i++) //输出2进制数列 { printf("%d", two[i]); if((i+1) % 4 == 0) printf(" "); } printf("\n"); } void printf_eight(int eight_num) {//得到八进制的个数 eight_num--; printf("8进制: "); while(eight[eight_num] == 0) eight_num--; for(; eight_num >= 0; eight_num--) { printf("%d", eight[eight_num]); } printf("\n-----------------------------------------------------------------\n"); } int main() { printf("输入16进制数: "); while(gets(sixteen)) { two_n = 0; eight_n = 0; //检验输入的十六进制数是否符合规定 if(check() == 0) continue; two_n = sixteen_two(); //读取十六进制,算出二进制存在two数组和个数two_n //读取二进制个数,算出八进制存在eight数组和返回个数eight_n eight_n = two_eight(two_n); printf_two(two_n); //输出二进制 printf_eight(eight_n); //输出八进制 printf("输入16进制数: "); } return 0; }
相关文章推荐
- 个人分析
- 【Unity3D】【NGUI】怎样动态给EventDelegate加入參数
- 20 Valid Parentheses
- Oracle存在则修改,不存在插入记录
- 泛型数据容器Demo
- 关于maven下载jar包失败的问题的总结和解决
- Modernizr——为HTML5和CSS3而生!
- DB2获取月份第一天最后一天
- 关于AssetBundle、热更新、BestHttp
- listview android:cacheColorHint,android:listSelector属性作用
- python主要知识点(与Java的区别)
- Mac os x yosemite安装appium 1.2.4及运行sample成功遇到的问题
- PHP单例模式应用详解
- Pku oj 3617 Best Cow Line(贪心)
- Hibernate+JSP+Servlet应用(OpenSessionInView模式)
- more is better(并查集)
- 第二次例会~
- HDU 1233 还是畅通工程
- 服务端备份错误的解决方法,利用fastcopy工具备份
- 学习笔记一之transient关键字&foreach循环