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

时间:2021-10-23 20:57:58

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

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