前言:
十进制:我们日常生活中使用的计数系统,使用0-9这10个数字
二进制:计算机使用的计数系统,只使用0和1两个数字
八进制:使用0-7这8个数字
十六进制:使用0-9和A-F(代表10-15)这16个字符
在上一篇中和大家一起了解了二级制转十进制的方法。
在基于上面的知识上,在本篇中我们一起来思考八进制,十六进制是如何转化的。
一:二进制转化八进制
在已经学习了二进制转换十进制后,可以举一反三。
方法一:间接转化,借助十进制。
第一步:先转化十进制在转换为八进制
二进制转十进制使用加权求和法:
-
从右向左,每一位的权重是2的幂次(从0开始)
-
将每一位的数字乘以对应的权重,然后求和
第二步:十进制转八进制
十进制转八进制使用连续除法:
-
用十进制数连续除以8
-
记录每次的余数
-
直到商为0为止
-
将余数从下到上排列
示例: 将十进制数 186
转换为八进制
text
186 ÷ 8 = 23 余 2 ↑ 23 ÷ 8 = 2 余 7 ↑ 读取方向 2 ÷ 8 = 0 余 2 ↑ 从下到上读取余数:272
二进制 10111010
=十进制 186
= 八进制 272
方法二:直接转化
二进制转八进制非常简单,因为8是2的3次方(2³=8),所以我们可以将二进制数每3位一组转换为八进制。
转换步骤:
-
从右向左,将二进制数每3位分成一组
-
如果最左边的一组不足3位,在前面补0
-
将每组的3位二进制数转换为对应的八进制数
转换表:
二进制 | 八进制 |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
#include <stdio.h>
/**
* 十进制转八进制(基础版本)
* @param decimal 十进制数
*/
void decimal_to_octal_basic(int decimal) {
// 处理0的情况
if (decimal == 0) {
printf("0\n");
return;
}
int octal[100]; // 存储八进制各位数字
int index = 0;
int num = decimal;
// 处理负数
int is_negative = 0;
if (decimal < 0) {
is_negative = 1;
num = -decimal;
}
// 连续除以8,记录余数
while (num > 0) {
octal[index] = num % 8; // 存储余数
num = num / 8;
index++;
}
// 输出结果(从最后一个余数开始)
if (is_negative) {
printf("-");
}
for (int i = index - 1; i >= 0; i--) {
printf("%d", octal[i]);
}
printf("\n");
}
二:二进制转化十六进制
方法同上有直接方法也有
间接的方法,同样也是借助是十进制转化
借助十进制法
#include <stdio.h>
#include <string.h>
#include <math.h>
long binary_to_decimal(const char* binary_str) {
long decimal = 0;
int length = strlen(binary_str);
for (int i = 0; i < length; i++) {
if (binary_str[i] == '1') {
decimal += (long)pow(2, length - 1 - i);
} else if (binary_str[i] != '0') {
return -1; // 无效的二进制字符
}
}
return decimal;
}
int decimal_to_hex(long decimal, char* hex_str, size_t buffer_size) {
if (decimal == 0) {
if (buffer_size >= 2) {
strcpy(hex_str, "0");
return 0;
}
return -1;
}
char temp[32];
int temp_index = 0;
unsigned long num = (unsigned long)decimal; // 使用无符号数处理
while (num > 0) {
int remainder = num % 16;
if (remainder < 10) {
temp[temp_index++] = '0' + remainder;
} else {
temp[temp_index++] = 'A' + (remainder - 10);
}
num = num / 16;
}
// 检查缓冲区是否足够
if (temp_index + 1 > (int)buffer_size) {
return -1;
}
// 反转字符串
for (int i = 0; i < temp_index; i++) {
hex_str[i] = temp[temp_index - 1 - i];
}
hex_str[temp_index] = '\0';
return 0;
}
return 成功返回0,失败返回-1
int binary_to_hex_via_decimal(const char* binary_str, char* hex_str, size_t buffer_size) {
// 二进制转十进制
long decimal = binary_to_decimal(binary_str);
if (decimal == -1) {
return -1;
}
// 十进制转十六进制
return decimal_to_hex(decimal, hex_str, buffer_size);
}