当前位置: 首页 > news >正文

二进制、八进制、十进制和十六进制间的转换(原理及工程实现)

        在计算机科学和编程中,进制转换是一个非常重要的基础知识。无论是二进制、八进制、十进制还是十六进制,它们在不同的场景中都有广泛的应用。本文将详细介绍常用进制之间的转换方法,并附上C语言示例代码,帮助大家更好地理解和掌握这一知识点。


1. 什么是进制?

        进制(Number System)是一种表示数字的方法,常见的进制包括:

  • 二进制(Binary):基数为 2,使用数字 0 和 1。

  • 八进制(Octal):基数为 8,使用数字 0 到 7。

  • 十进制(Decimal):基数为 10,使用数字 0 到 9。

  • 十六进制(Hexadecimal):基数为 16,使用数字 0 到 9 和字母 A 到 F。


2. 进制转换方法

2.1 二进制、八进制、十六进制转十进制

        将其他进制转换为十进制的方法是通过按权展开法。公式如下:

a=d_n \times r^n+d_{n-1} \times r^{n-1}+\cdots+d_0 \times r^0

其中:

  • d 是每一位的数字;

  • r 是基数(二进制为 2,八进制为 8,十六进制为 16);

  • nn是位数。

示例 1:二进制转十进制

        将二进制数 1011 转换为十进制:

     1 \times 2^3+0 \times 2^2+1 \times 2^1+1 \times 2^0=8+0+2+1=11

示例 2:十六进制转十进制

        将十六进制数 1A3 转换为十进制:

1 \times 16^2+10 \times 16^1+3 \times 16^0=256+160+3=419


2.2 十进制转二进制、八进制、十六进制

        将十进制转换为其他进制的方法是除基取余法,即不断除以目标进制基数,记录余数,直到商为 0,最后将余数倒序排列。

 示例 3:十进制转二进制

        将十进制数 25 转换为二进制:

25÷2=12 余1

12÷2=12 余0

6÷2=12 余0

3÷2=12 余1

1÷2=12 余1

        将余数倒序排列:11001,所以 25 的二进制表示为 11001

示例 4:十进制转十六进制

        将十进制数 300 转换为十六进制:

300÷16=18   余12(C)

18÷16=1  余2

1÷16=0   余1

        将余数倒序排列:12C,所以 300 的十六进制表示为 12C


2.3 二进制与八进制、十六进制的互相转换

        由于 8=2^316=2^4,二进制与八进制、十六进制之间的转换可以通过分组法快速完成。

示例 5:二进制转八进制

        将二进制数 101110 转换为八进制:

  1. 从右向左每 3 位分组:101 110

  2. 将每组转换为十进制:

    101 = 1 \times 2^2+0 \times 2^1+1 \times 2^0=5
    110 = 1 \times 2^2+1 \times 2^1+0 \times 2^0=6
  3. 组合结果:56

示例 6:十六进制转二进制

将十六进制数 3F 转换为二进制:

  1. 将每位十六进制数转换为 4 位二进制:

    • 3 = 0011

    • F = 1111

  2. 组合结果:00111111


3. 编程实现进制转换(C语言)

以下是使用C语言实现进制转换的示例代码:

3.1 十进制转二进制、八进制、十六进制

#include <stdio.h>

void decimalToBinary(int num) {
    if (num > 1) {
        decimalToBinary(num / 2);
    }
    printf("%d", num % 2);
}

void decimalToOctal(int num) {
    if (num > 7) {
        decimalToOctal(num / 8);
    }
    printf("%d", num % 8);
}

void decimalToHexadecimal(int num) {
    if (num > 15) {
        decimalToHexadecimal(num / 16);
    }
    int remainder = num % 16;
    if (remainder < 10) {
        printf("%d", remainder);
    } else {
        printf("%c", 'A' + (remainder - 10));
    }
}

int main() {
    int num = 255;

    printf("十进制数 %d 的二进制表示为: ", num);
    decimalToBinary(num);
    printf("\n");

    printf("十进制数 %d 的八进制表示为: ", num);
    decimalToOctal(num);
    printf("\n");

    printf("十进制数 %d 的十六进制表示为: ", num);
    decimalToHexadecimal(num);
    printf("\n");

    return 0;
}

3.2 其他进制转十进制

#include <stdio.h>
#include <string.h>
#include <math.h>

int binaryToDecimal(char *binary) {
    int decimal = 0, length = strlen(binary);
    for (int i = 0; i < length; i++) {
        if (binary[i] == '1') {
            decimal += pow(2, length - i - 1);
        }
    }
    return decimal;
}

int octalToDecimal(char *octal) {
    int decimal = 0, length = strlen(octal);
    for (int i = 0; i < length; i++) {
        decimal += (octal[i] - '0') * pow(8, length - i - 1);
    }
    return decimal;
}

int hexadecimalToDecimal(char *hex) {
    int decimal = 0, length = strlen(hex);
    for (int i = 0; i < length; i++) {
        if (hex[i] >= '0' && hex[i] <= '9') {
            decimal += (hex[i] - '0') * pow(16, length - i - 1);
        } else if (hex[i] >= 'A' && hex[i] <= 'F') {
            decimal += (hex[i] - 'A' + 10) * pow(16, length - i - 1);
        }
    }
    return decimal;
}

int main() {
    char binary[] = "1010";
    char octal[] = "12";
    char hex[] = "1A";

    printf("二进制数 %s 的十进制表示为: %d\n", binary, binaryToDecimal(binary));
    printf("八进制数 %s 的十进制表示为: %d\n", octal, octalToDecimal(octal));
    printf("十六进制数 %s 的十进制表示为: %d\n", hex, hexadecimalToDecimal(hex));

    return 0;
}


4. 总结

进制转换是计算机科学中的基础技能,掌握它对于理解计算机底层原理和编程非常重要。本文介绍了常用的进制转换方法,并通过C语言示例代码帮助大家更好地理解。

相关文章:

  • 基于 uni-app 和 Vue3 开发的汉字书写练习应用
  • 【交通网络拓扑图实现原理深度解析】
  • 2.PSCAD是什么软件?
  • 中间件专栏之MySQL篇——MySQL的索引原理
  • 政务信息化项目审计全解析:核心重点与区域实践差异化破局
  • 有效的完全平方数
  • 基于微信小程序的竞赛报名系统设计与实现
  • 《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》
  • x86寄存器(二):通用寄存器、指令指针寄存器和标志寄存器
  • 解决Selenium元素拖拽不生效Bug
  • open webui-二次开发-源码启动前后端工程-【超简洁步骤】
  • 利用MQ自动取消未支付超时订单最佳实践
  • 大模型最新面试题系列:训练篇之模型监控与调试
  • 静态时序分析:报告命令report_timing详解
  • C++中的.h文件一般是干什么的?
  • 数据结构–栈
  • Python中的常用库
  • RMAN备份bug-审计日志暴涨(select action from gv$session)
  • Qt添加MySql数据库驱动
  • PromQL计算gateway指标增量最佳实践及常见问题答疑
  • 上海电视节评委会名单公布,陈宝国担任电视剧评委会主席
  • 住建部:截至去年底常住人口城镇化率达到67%
  • 安徽凤阳通报鼓楼瓦片脱落:去年3月维修竣工,已成立调查组
  • 再囤三个月库存!美国客户抢付尾款,外贸企业发货订单排到7月
  • 习近平在河南洛阳市考察调研
  • 波兰总统选举投票开始,将是对亲欧路线的一次严峻考验