十六进制转化为八进制c语言_16进制和二进制转换

十六进制转化为八进制c语言_16进制和二进制转换进制是一种数学表示方法,用来表示数字的大小

题目:

请添加图片描述

什么是进制?

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

在我们通常使用的十进制系统中,每个数字位上的数值是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

今天的文章十六进制转化为八进制c语言_16进制和二进制转换分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84450.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注