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

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

运行结果:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值