二进制数、八进制数、十六进制数是计算机中常用的进制,它们都能够表示数字和字符,但使用的位数和表示方式不同。下面我们来介绍一下它们的转换规则:
- 二进制数的转换规则
二进制数是基于 2 的进制表示法。它只包括两个数字:0 和 1。在二进制数中,每一位代表一个 2 的幂次。
二进制数转换为十进制数:将二进制数的每一位按照权重展开,将每位的值乘以其所在位的权重,再将所有的结果相加。
例如:1101(二进制)= 12³ + 12² + 02¹ + 12º = 8+4+0+1 = 13(十进制)
十进制数转换为二进制数:反复除以2,直到结果为0,将每一次的余数从下往上写成二进制数。
例如:23(十进制)= 10111(二进制)
- 八进制数的转换规则
八进制数是基于 8 的进制表示法。它由 0-7 这 8 个数字组成。在八进制数中,每一位代表一个 8 的幂次。
八进制数转换为十进制数:将八进制数的每一位按照权重展开,将每位的值乘以其所在位的权重,再将所有的结果相加。
例如:347(八进制)= 38² + 48¹ + 7*8º = 192+32+7 = 231(十进制)
十进制数转换为八进制数:反复除以8,直到结果为0,将每一次的余数从下往上写成八进制数。
例如:231(十进制)= 347(八进制)
- 十六进制数的转换规则
十六进制数是基于 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(十六进制)
下面是一些具体的实现方式:
- 二进制数转八进制数示例代码:
#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;
}
- 八进制数转二进制数示例代码:
#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;
}
- 十六进制数转十进制数示例代码:
#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;
}
- 十进制数转十六进制数示例代码:
#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;
}