十六进制转化八进制(C语言)

题目:

请添加图片描述

什么是进制?

进制是一种数学表示方法,用来表示数字的大小。
在这里插入图片描述

在我们通常使用的十进制系统中,每个数字位上的数值是0到9之间的整数,而位权则是10的幂次方。例如,在十进制系统中,数值427表示了4* 10^2 + 2* 10^1 + 7*10^0。
除了十进制外,还有其他常见的进制系统,如二进制、八进制和十六进制。在二进制中,每个数字位上的数值是0或1,位权是2的幂次方;在八进制中,每个数字位上的数值是0到7之间的整数,位权是8的幂次方;在十六进制中,每个数字位上的数值是0到15之间的整数,通常用0-9和A-F来表示,位权是16的幂次方。

不同进制系统之间可以相互转换,例如,可以将一个二进制数转换为对应的十进制数,或者将一个十六进制数转换为对应的二进制数。进制系统的选择可以根据不同的应用需求,比如在计算机中,二进制常用于表示和处理数字,而在一些领域,如网络编址和颜色表示,八进制和十六进制更为常见。
在这里插入图片描述
简单的看两个例子:
Step 1: 将二进制数转换为对应的十进制数
假设我们有一个8位的二进制数11011010。
首先写下二进制数和对应的位权:

1   | 1  | 0  | 1  | 1 | 0 | 1 | 0
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1

然后将每个位上的数值与对应的位权相乘,并将结果相加:
(1128) + (164) + (032) + (116) + (18) + (04) + (12) + (01) = 218
所以,二进制数11011010对应的十进制数是218。

Step 2: 将十进218制数转换为十六进制数
首先,将十进制数除以16,得到商和余数:
218 ÷ 16 = 13 余 10
①将得到的余数转换为十六进制数的格式。因为余数是10,所以用字母A表示,因此余数10对应的十六进制数是_A_。
②将得到的商继续除以16,直到商为0为止,依次得到的余数就是最终的十六进制数。
商13 ÷ 16 = 0 余 13
将得到的余数13转换为十六进制数的格式,即_D_。
因此,十进制数218对应的十六进制数是_DA_。

思考1:十六进制如何转换为八进制

1、先转化为十进制在转化为八进制
2、转化为二进制在再转为八进制

代码示例

#include <stdio.h>   // 引入标准输入输出库,用于scanf和printf等函数
#include <string.h>  // 引入字符串操作库,用于strlen等函数

// 函数:将十六进制字符串转换为十进制整数
int hexToDec(char hex[]) {
    int dec = 0, base = 1; // dec存储最终十进制数,base用于计算当前位的权重
    int len = strlen(hex); // 获取十六进制字符串的长度
    // 从字符串的末尾开始向前遍历
    for (int i = len - 1; i >= 0; i--) {
        // 如果是0-9的字符,则转换为相应的数字
        if (hex[i] >= '0' && hex[i] <= '9') {
            dec += (hex[i] - '0') * base;
        }
        // 如果是A-F的字符,则转换为相应的数字(10-15)
        else if (hex[i] >= 'A' && hex[i] <= 'F') {
            dec += (hex[i] - 'A' + 10) * base;
        }
        base *= 16; // 更新base为下一位的权重
    }
    return dec; // 返回计算出的十进制数
}

// 函数:将十进制整数转换为八进制整数
int decToOct(int dec) {
    int oct[100] = { 0 }; // 存储八进制数字的数组
    int i = 0; // 数组索引
    int result = 0; // 存储最终结果的变量

    // 特殊情况处理:如果十进制数为0,则直接返回0
    if (dec == 0) {
        return 0;
    }

    // 当十进制数大于0时进行转换
    while (dec > 0) {
        oct[i] = dec % 8; // 取余得到八进制的一位
        dec /= 8; // 十进制数除以8,准备计算下一位
        i++; // 移动数组索引
    }

    // 由于得到的八进制数组是反过来的,需要从后往前组装成最终的八进制整数
    for (int j = i - 1; j >= 0; j--) {
        result = result * 10 + oct[j];
    }
    return result; // 返回计算出的八进制数
}

// 程序入口点:main函数
int main() {
    int n; // 存储用户输入的十六进制数的个数
    char hex[100000]; // 存储用户输入的十六进制字符串

    // 读入十六进制数的个数
    scanf("%d", &n);
    // 循环读入每一个十六进制数,并进行转换
    for (int i = 0; i < n; i++) {
        scanf("%s", hex); // 读入十六进制字符串
        int dec = hexToDec(hex); // 转换为十进制
        int oct = decToOct(dec); // 将十进制转换为八进制
        printf("%d\n", oct); // 输出八进制数
    }

    return 0; // 程序结束
}

函数先定义了两个函数:
第一个·函数定义了一个以字符串数组为参数的函数hexToDec
在函数内部,它使用一个循环来逐个处理输入的十六进制数的字符,并将其转换为对应的十进制数。这些转换细节可以解释如下:

  1. 首先,len用来计算输入字符串的长度,以确保函数可以迭代每个输入的字符。
  2. 然后,函数使用for循环从字符串的末尾向开始迭代字符串中的字符。在每一次循环中,它检查当前字符是数字还是字母。
  3. 如果当前字符是一个数字(0到9之间的字符),则使用(hex[i] - '0')来将其转换为对应的数字,并乘以当前位的权值base,然后将该值加到dec上。
  4. 如果当前字符是一个字母(A到F之间的字符),则使用(hex[i] - 'A' + 10)将其转换为对应的数字,并乘以当前位的权值base,然后将该值加到dec上。
  5. 每次迭代后,base乘以16来更新权值,以确保后续迭代中正确地计算权值。
  6. 最后,dec 的值即为最终的十进制数值,函数将其返回给调用者。
    这样,这个函数实际上是将输入的十六进制数转换为对应的十进制数。

第二个·函数 decToOct 用于将给定的十进制数转换为对应的八进制数。
首先,函数接受一个十进制数作为输入参数。

  1. 创建一个存储八进制数字的数组 oct,数组长度为 100,且每个元素被初始化为 0。
  2. 初始化变量 i 为 0,这将被用作数组 oct 的索引。
  3. 初始化变量 result 为 0,用于存储最终转换的八进制数值。
  4. 如果输入的十进制数为 0,函数直接返回 0。
    接下来是具体的转换过程:
  5. 当输入的十进制数大于 0 时,进入循环进行转换操作。每次循环,计算当前十进制数对 8 取余的结果,得到的余数就是最低位的八进制数值,并将其存储在数组 oct 中。然后将十进制数除以 8,准备计算下一位。同时,增加数组索引 i
  6. 由于得到的八进制数组是反过来的(最高位在数组最后),所以需要从后往前组装成最终的八进制整数。此步骤通过一个循环完成,将数组中的数字依次组合成最终的八进制数值,并存储在 result 中。
  7. 最后,函数返回计算出的八进制数值 result
  • 24
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琪琪的小白先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值