【C语言】二进制转八进制 十六进制示例代码

前言:

十进制:我们日常生活中使用的计数系统,使用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位一组转换为八进制。

转换步骤:

  1. 从右向左,将二进制数每3位分成一组

  2. 如果最左边的一组不足3位,在前面补0

  3. 将每组的3位二进制数转换为对应的八进制数

转换表:

二进制八进制
0000
0011
0102
0113
1004
1015
1106
1117
#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值