十六进制转二进制转八进制

来源:互联网 发布:linux命令cat和grep 编辑:程序博客网 时间:2024/05/26 07:27

存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;}

运行结果:

1 0
原创粉丝点击