二进制数、八进制数、十六进制数是计算机中常用的进制,它们都能够表示数字和字符,但使用的位数和表示方式不同。下面我们来介绍一下它们的转换规则:

  1. 二进制数的转换规则

二进制数是基于 2 的进制表示法。它只包括两个数字:0 和 1。在二进制数中,每一位代表一个 2 的幂次。

二进制数转换为十进制数:将二进制数的每一位按照权重展开,将每位的值乘以其所在位的权重,再将所有的结果相加。

例如:1101(二进制)= 12³ + 12² + 02¹ + 12º = 8+4+0+1 = 13(十进制)

十进制数转换为二进制数:反复除以2,直到结果为0,将每一次的余数从下往上写成二进制数。

例如:23(十进制)= 10111(二进制)

  1. 八进制数的转换规则

八进制数是基于 8 的进制表示法。它由 0-7 这 8 个数字组成。在八进制数中,每一位代表一个 8 的幂次。

八进制数转换为十进制数:将八进制数的每一位按照权重展开,将每位的值乘以其所在位的权重,再将所有的结果相加。

例如:347(八进制)= 38² + 48¹ + 7*8º = 192+32+7 = 231(十进制)

十进制数转换为八进制数:反复除以8,直到结果为0,将每一次的余数从下往上写成八进制数。

例如:231(十进制)= 347(八进制)

  1. 十六进制数的转换规则

十六进制数是基于 16 的进制表示法。它由数字 0-9 和字母 A-F 组成,其中 A-F 表示 10-15。在十六进制数中,每一位代表一个 16 的幂次。

十六进制数转换为十进制数:将十六进制数的每一位按照权重展开,将每位的值乘以其所在位的权重,再将所有的结果相加。

例如:1A5(十六进制)= 116² + 1016¹ + 5*16º = 256+160+5 = 421(十进制)

十进制数转换为十六进制数:反复除以16,直到结果为0,将每一次的余数从下往上写成十六进制数。对于大于9的余数,用字母 A-F 表示。

例如:421(十进制)= 1A5(十六进制)

下面是一些具体的实现方式:

  1. 二进制数转八进制数示例代码:
#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
    char binary_number[20], octal_number[20];
    int i = 0, j = 0, remainder = 0, octal = 0;

    printf("Enter a binary number: ");
    scanf("%s", binary_number);

    int binary_len = strlen(binary_number);

    while(binary_len--)
    {
        remainder += (binary_number[binary_len] - '0') * pow(2, i++);
        if(i == 3 || binary_len == 0)
        {
            octal_number[j++] = remainder+'0';
            i = 0;
            remainder = 0;
        }
    }

    octal_number[j] = '\0';

    for(i = 0; i < j; i++)
    {
        octal += pow(10, i) * (octal_number[j-i-1]-'0');
    }

    printf("Octal number is: %d\n", octal);

    return 0;
}
  1. 八进制数转二进制数示例代码:
#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
    char octal_number[20], binary_number[50];
    int i = 0, j = 0;

    printf("Enter an octal number: ");
    scanf("%s", octal_number);

    int octal_len = strlen(octal_number);

    while(octal_len--)
    {
        int octal_digit = octal_number[octal_len] - '0';
        while(octal_digit--)
        {
            binary_number[i++] = '1';
        }
        while(i % 3 != 0 && i < (j+1)*3)
        {
            binary_number[i++] = '0';
        }

        if(i % 3 == 0)
        {
            j++;
        }
    }

    binary_number[i] = '\0';

    for(i = strlen(binary_number)-1; i >= 0; i--)
    {
        printf("%c", binary_number[i]);
    }
    printf("\n");

    return 0;
}
  1. 十六进制数转十进制数示例代码:
#include<stdio.h>
#include<string.h>
#include<math.h>

int get_decimal_number(char hex_character)
{
    if(hex_character >= '0' && hex_character <= '9')
    {
        return hex_character-'0';
    }
    else if(hex_character >= 'A' && hex_character <= 'F')
    {
        return hex_character-'A'+10;
    }
    else if(hex_character >= 'a' && hex_character <= 'f')
    {
        return hex_character-'a'+10;
    }
    else
    {
        printf("Invalid hex character\n");
        return -1;
    }
}

int main()
{
    char hex_number[20];
    int i = 0, decimal = 0;

    printf("Enter a hex number: ");
    scanf("%s", hex_number);

    for(i = strlen(hex_number)-1; i >= 0; i--)
    {
        decimal += get_decimal_number(hex_number[i]) * pow(16, strlen(hex_number)-i-1);
    }

    printf("Decimal number is: %d\n", decimal);

    return 0;
}
  1. 十进制数转十六进制数示例代码:
#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
    int decimal_number, i = 0;
    char hex_number[20];

    printf("Enter a decimal number: ");
    scanf("%d", &decimal_number);

    while(decimal_number > 0)
    {
        int remainder = decimal_number % 16;
        if(remainder < 10)
        {
            hex_number[i++] = remainder + '0';
        }
        else
        {
            hex_number[i++] = remainder - 10 + 'A';
        }
        decimal_number /= 16;
    }

    hex_number[i] = '\0';

    for(i = strlen(hex_number)-1; i >= 0; i--)
    {
        printf("%c", hex_number[i]);
    }
    printf("\n");

    return 0;
}