小甲鱼 发表于 2024-5-24 18:47:33

深入浅出进制转换

深入浅出进制转换

进制转换是在编程中非常常见的操作,特别是在数据处理和底层开发中。

这里小甲鱼将深入浅出地讲解进制转换的原理和实现方法。


进制的基本概念

在计算机科学中,最常用的进制有二进制(Binary)、十进制(Decimal)、八进制(Octal)和十六进制(Hexadecimal)。它们分别使用不同的基数(Base):


[*]二进制:基数为 2,使用数字 0 和 1 表示。
[*]十进制:基数为 10,使用数字 0 到 9 表示。
[*]八进制:基数为 8,使用数字 0 到 7 表示。
[*]十六进制:基数为 16,使用数字 0 到 9 和字母 A 到 F(其中,A 表示 10,F 表示 15)。

这是什么意思呢,比如对于二进制数来说,它只有 0 和 1 两个数字。

所以,当要表示十进制的数字 3 时,对应的二进制数应该是 11。

以下是一些十进制数字及其相对应的二进制、八进制和十六进制表示:


十进制二进制八进制十六进制
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F


进制系统的基本原理

任何进制系统都是基于其基数的幂来表示数值。

十进制是基数为 10 的数制,每一位上的值是 10 的幂次倍数:

$d_{n} \times 10^{n} + d_{n-1} \times 10^(n-1) + \dots + d_{1} \times 10^{1} + d_{0} \times 10^{0}$

例如,十进制数 250,就相当于:

$2 \times 10^{2} + 5 \times 10^{1} + 0 \times 10^{0} = 250$

同样地,二进制是基数为 2 的数制,每一位上的值是 2 的幂次倍数:

$b_{n} \times 2^{n} + b_{n-1} \times 2^(n-1) + \dots + b_{1} \times 2^{1} + b_{0} \times 2^{0}$

因此,二进制数 110,就相当于:

$1 \times 2^{2} + 1 \times 2^{1} + 0 \times 2^{0}= 4 + 2 = 6$

理解进制系统的基本原理后,我们也就掌握了任何进制数转换为十进制数的方法!

这个过程的核心在于理解每个位置上的数值是基数的幂次倍数,并通过累加这些数值来得到十进制表示。


对于小数也是以此类推,比如二进制数 110.011,就相当于:

$1 \times 2^{2} + 1 \times 2^{1} + 0 \times 2^{0} + 0 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3}= 4 + 2 + 0.25 + 0.125 = 6.375$


十进制转换到其他进制的方法

十进制转二进制

在二进制数中,每一位只能是 0 或 1。

要将一个十进制数转换为二进制,我们需要确定每个二进制位上的值。

这可以通过除以 2 并求余数来实现:


[*]除以 2:将十进制数除以 2,记录商和余数。
[*]重复步骤:用商继续除以 2,直到商为 0。
[*]记录余数:将所有余数逆序排列,即为二进制表示。

示例:

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


[*]12 / 2 = 6……0
[*]6 / 2 = 3……0
[*]3 / 2 = 1……1
[*]1 / 2 = 0……1

结果从下往上看,因此,十进制的数字 12,对应到二进制的结果就是 1100。


对于带小数的十进制数,整数部分和小数部分需要做不同处理。

比如十进制数 6.375,整数部分不变,同样是通过除以 2 并求余数:


[*]6 / 2 = 3……0
[*]3 / 2 = 1……1
[*]1 / 2 = 0……1

得到二进制整数 110。

对于小数部分,则需要通过乘以 2,取整数部分:


[*]0.375 * 2 = 0.75 取整数部分 0
[*]0.75 * 2 = 1.5 取整数部分 1
[*]0.5 * 2 = 1.0取整数部分 1

结果从上往下看,得到二进制小数 011。

合并后的结果是 110.011,即十进制数 6.375 转换为二进制数是 110.011。


十进制转八进制

同样的道理,对于八进制,可以通过除以 8 并求余数来实现:


[*]除以 8:将十进制数除以 8,记录商和余数。
[*]重复步骤:用商继续除以 8,直到商为 0。
[*]记录余数:将所有余数逆序排列,即为八进制表示。

示例:


[*]110 / 8 = 13……6
[*]13 / 8 = 1……5
[*]1 / 8 = 0……1

因此,十进制的数字 110,对应到二进制的结果就是 156。


十进制转十六进制

同样的道理,对于十六进制,可以通过除以 16 并求余数来实现:


[*]除以 16:将十进制数除以 16,记录商和余数。
[*]重复步骤:用商继续除以 16,直到商为 0。
[*]记录余数:将所有余数逆序排列,即为十六进制表示。

示例:


[*]250 / 16 = 15……10
[*]15 / 16 = 0……15

由于十六进制数使用 A 表示 10,使用 F 表示 15。

因此,十进制的数字 250,对应到十六进制的结果就是 FA。


clollipops 发表于 2024-5-26 18:44:27

基本知识必须掌握

125800 发表于 2024-5-26 18:45:45

基本知识必须掌握

zhae89 发表于 2024-5-26 18:46:24

又学到新知识了

ABitGinger 发表于 2024-5-26 18:46:48

基础知识小复习,yummy{:10_270:}

Pioneer. 发表于 2024-5-26 18:47:18

基本知识必须得掌握

kounasx 发表于 2024-5-26 18:55:06

学习学习

格子penbeat 发表于 2024-5-26 18:59:54

基本知识,必须掌握

向尚的小六 发表于 2024-5-26 19:00:53

要长脑子了

想个好名字@ 发表于 2024-5-26 19:09:27

巩固基础知识,筑牢编程根基

kyo890814 发表于 2024-5-26 19:10:49

基本知识一定掌握

林木荟蔚 发表于 2024-5-26 19:12:15

基础知识是学习编程的根基,必须掌握运用

小小的学习 发表于 2024-5-26 19:23:39

基本知识复习

神荼Q 发表于 2024-5-26 19:23:56

这个讲的是很明白,但是用的时候就会有一些懵,甚至有很多时候会把二进制和十进制搞混

鲁诺 发表于 2024-5-26 19:30:10

零基础学习Javac

忘川hd 发表于 2024-5-26 19:35:12

好好学习学习

Ming-02 发表于 2024-5-26 19:40:25

复习来了

画风华 发表于 2024-5-26 20:05:54

持续学习,每天好心情!

亿壹粟 发表于 2024-5-26 20:05:55

写个c+'+程序实践一下doge,加深印象

大魔王666 发表于 2024-5-26 20:21:52

收藏了
页: [1] 2
查看完整版本: 深入浅出进制转换