不同进制之间的转换

目录

  • 前言
  • 进制转换
    • 10进制转2进制
      • 方法1
      • 方法2
    • 2进制转10进制
    • 10进制转n进制
    • n进制转10进制
    • 2进制与8进制和16进制之间的快速转换
  • 代码实现
    • 10进制转n进制
      • C++
      • Python
    • n进制转10进制
      • C++
      • Python
  • 结尾


本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser

前言

这一章,介绍一下不同的进制。
是否留意过,为什么经常能够看到一些以0x开头的数字呢?
其实,这些数字都是16进制的。前缀0x用于提示该数字为16进制。
一些其它的前缀还有二进制数0b,八进制数0o

进制转换

如何转换进制呢?先来看看10进制转2进制吧。

10进制转2进制

方法1

概括来说,就是“余数倒序”法。每次都求出数字除以2的余数,再将数字除以二并删去小数直到数字为0;最后将这些余数倒过来。
例如,将 114514 114514 114514转换为2进制:

当前数字算式结果余数
114514 114514 114514 114514 ÷ 2 = 114514÷2= 114514÷2= 57257 57257 57257 0 0 0
57257 57257 57257 57257 ÷ 2 = 57257÷2= 57257÷2= 28628 28628 28628 1 1 1
28628 28628 28628 28628 ÷ 2 = 28628÷2= 28628÷2= 14314 14314 14314 0 0 0
14314 14314 14314 14314 ÷ 2 = 14314÷2= 14314÷2= 7157 7157 7157 0 0 0
7157 7157 7157 7157 ÷ 2 = 7157÷2= 7157÷2= 3578 3578 3578 1 1 1
3578 3578 3578 3578 ÷ 2 = 3578÷2= 3578÷2= 1789 1789 1789 0 0 0
1789 1789 1789 1789 ÷ 2 = 1789÷2= 1789÷2= 894 894 894 1 1 1
894 894 894 894 ÷ 2 = 894÷2= 894÷2= 447 447 447 0 0 0
447 447 447 447 ÷ 2 = 447÷2= 447÷2= 223 223 223 1 1 1
223 223 223 223 ÷ 2 = 223÷2= 223÷2= 111 111 111 1 1 1
111 111 111 111 ÷ 2 = 111÷2= 111÷2= 55 55 55 1 1 1
55 55 55 55 ÷ 2 = 55÷2= 55÷2= 27 27 27 1 1 1
27 27 27 27 ÷ 2 = 27÷2= 27÷2= 13 13 13 1 1 1
13 13 13 13 ÷ 2 = 13÷2= 13÷2= 6 6 6 1 1 1
6 6 6 6 ÷ 2 = 6÷2= 6÷2= 3 3 3 0 0 0
3 3 3 3 ÷ 2 = 3÷2= 3÷2= 1 1 1 1 1 1
1 1 1 1 ÷ 2 = 1÷2= 1÷2= 0 0 0 1 1 1

最后,将余数倒过来: 11011111101010010 11011111101010010 11011111101010010
所以, ( 114514 ) 10 = ( 11011111101010010 ) 2 (114514)_{10}=(11011111101010010)_2 (114514)10=(11011111101010010)2

方法2

概括来说,叫“2的幂次法”。不停地求2的幂,直到比需要转换的数字大。之后,逐个进行比较,大于记为 1 1 1,然后相减,小于记为 0 0 0。具体如下,还是 114514 114514 114514

2 17 2^{17} 217 2 16 2^{16} 216 2 15 2^{15} 215 2 14 2^{14} 214 2 13 2^{13} 213 2 12 2^{12} 212 2 11 2^{11} 211 2 10 2^{10} 210 2 9 2^{9} 29 2 8 2^{8} 28 2 7 2^{7} 27 2 6 2^{6} 26 2 5 2^{5} 25 2 4 2^{4} 24 2 3 2^{3} 23 2 2 2^{2} 22 2 1 2^{1} 21 2 0 2^{0} 20
131072 131072 131072 65536 65536 65536 32768 32768 32768 16384 16384 16384 8192 8192 8192 4096 4096 4096 2048 2048 2048 1024 1024 1024 512 512 512 256 256 256 128 128 128 64 64 64 32 32 32 16 16 16 8 8 8 4 4 4 2 2 2 1 1 1

过程:

当前数字比较算式结果算式
114514 114514 114514 114514 ≥ 131072 114514\geq131072 114514131072False(0)/
114514 114514 114514 114514 ≥ 65536 114514\geq65536 11451465536True(1) 114514 − 65536 = 48978 114514-65536=48978 11451465536=48978
48978 48978 48978 48978 ≥ 32768 48978\geq32768 4897832768True(1) 48978 − 32768 = 16210 48978-32768=16210 4897832768=16210
16210 16210 16210 16210 ≥ 16384 16210\geq16384 1621016384False(0)/
16210 16210 16210 16210 ≥ 8192 16210\geq8192 162108192True(1) 16210 − 8192 = 8018 16210-8192=8018 162108192=8018
8018 8018 8018 8018 ≥ 4096 8018\geq4096 80184096True(1) 8018 − 40963922 8018-4096 3922 801840963922
3922 3922 3922 3922 ≥ 2048 3922\geq2048 39222048True(1) 3922 − 20481847 3922-2048 1847 392220481847
1847 1847 1847 1847 ≥ 1024 1847\geq1024 18471024True(1) 1847 − 1024 = 850 1847-1024=850 18471024=850
850 850 850 850 ≥ 512 850\geq512 850512True(1) 850 − 512 = 338 850-512=338 850512=338
338 338 338 338 ≥ 256 338\geq256 338256True(1) 228 − 256 = 82 228-256=82 228256=82
82 82 82 82 ≥ 128 82\geq128 82128False(0)/
82 82 82 82 ≥ 64 82\geq64 8264True(1) 82 − 64 = 18 82-64=18 8264=18
18 18 18 18 ≥ 32 18\geq32 1832False(0)/
18 18 18 18 ≥ 16 18\geq16 1816True(1) 18 − 16 = 2 18-16=2 1816=2
2 2 2 2 ≥ 8 2\geq8 28False(0)/
2 2 2 2 ≥ 4 2\geq4 24False(0)/
2 2 2 2 ≥ 2 2\geq2 22True(1) 2 − 2 = 0 2-2=0 22=0
0 0 0 0 ≥ 1 0\geq1 01False(0)/

若将False记为 0 0 0,将True记为 1 1 1,那么将所有的比较结果从上往下排一遍,就得到了 011011111101010010 011011111101010010 011011111101010010。即, ( 114514 ) 10 = ( 11011111101010010 ) 2 (114514)_{10}=(11011111101010010)_2 (114514)10=(11011111101010010)2

2进制转10进制

假设有一个二进制数: ( 10110101 ) 2 (10110101)_2 (10110101)2,那么它的十进制是多少呢?
依然列出刚才的“幂次表”,将该二进制数填进去:

2 7 2^{7} 27 2 6 2^{6} 26 2 5 2^{5} 25 2 4 2^{4} 24 2 3 2^{3} 23 2 2 2^{2} 22 2 1 2^{1} 21 2 0 2^{0} 20
128 128 128 64 64 64 32 32 32 16 16 16 8 8 8 4 4 4 2 2 2 1 1 1
1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1

然后,观察二进制数:如果当前位是1,那么就将上面的幂次加起来。
2 7 + 2 5 + 2 4 + 2 2 + 2 0 \space\space\space\space2^7+2^5+2^4+2^2+2^0     27+25+24+22+20
= 128 + 32 + 16 + 4 + 1 =128+32+16+4+1 =128+32+16+4+1
= 181 =181 =181

所以, ( 10110101 ) 2 = ( 181 ) 10 (10110101)_2=(181)_{10} (10110101)2=(181)10

10进制转n进制

其实方法和前面介绍的“余数倒序”法大同小异。直接上例子:将 ( 1919 ) 10 (1919)_{10} (1919)10转换为 16 16 16进制。

当前数字算式结果余数
1919 1919 1919 1919 ÷ 16 = 1919÷16= 1919÷16= 119 119 119 15 15 15
119 119 119 119 ÷ 16 = 119÷16= 119÷16= 7 7 7 7 7 7
7 7 7 7 ÷ 16 = 7÷16= 7÷16= 0 0 0 7 7 7

再按照16进制的规则,10进制下的二位数分别对应16进制下的一位数:

10进制16进制
10 10 10 A A A
11 11 11 B B B
12 12 12 C C C
13 13 13 D D D
14 14 14 E E E
15 15 15 F F F

将余数倒序过来后,是 77 F 77F 77F
所以 ( 1919 ) 10 = ( 77 F ) 16 (1919)_{10}=(77F)_{16} (1919)10=(77F)16

n进制转10进制

和前面写的“幂次表”法相类似,由当前位乘幂次。
例:16进制数 ( 810 A ) 16 (810A)_{16} (810A)16转换为十进制是多少?

1 6 3 16^3 163 1 6 2 16^2 162 1 6 1 16^1 161 1 6 0 16^0 160
4096 4096 4096 256 256 256 16 16 16 1 1 1
8 8 8 1 1 1 0 0 0 A A A

10 × 1 6 0 + 0 × 1 6 1 + 1 × 1 6 2 + 8 × 1 6 3 \space\space\space\space10\times16^0+0\times16^1+1\times16^2+8\times16^3     10×160+0×161+1×162+8×163
= 10 × 1 + 0 × 16 + 1 × 256 + 8 × 4096 =10\times1+0\times16+1\times256+8\times4096 =10×1+0×16+1×256+8×4096
= 33034 =33034 =33034

所以 ( 810 A ) 16 = ( 33034 ) 10 (810A)_{16}=(33034)_{10} (810A)16=(33034)10

2进制与8进制和16进制之间的快速转换

由于 8 = 2 3 , 16 = 2 4 8=2^3,16=2^4 8=23,16=24,它们之间存在倍数关系,所以2进制转换为8进制和16进制有一种快捷的方法。
现在,列出对应的表:

16进制8进制2进制10进制
0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 10 10 10 2 2 2
3 3 3 3 3 3 11 11 11 3 3 3
4 4 4 4 4 4 100 100 100 4 4 4
5 5 5 5 5 5 101 101 101 5 5 5
6 6 6 6 6 6 110 110 110 6 6 6
7 7 7 7 7 7 111 111 111 7 7 7
8 8 8 10 10 10 1000 1000 1000 8 8 8
9 9 9 11 11 11 1001 1001 1001 9 9 9
A A A 12 12 12 1010 1010 1010 10 10 10
B B B 13 13 13 1011 1011 1011 11 11 11
C C C 14 14 14 1100 1100 1100 12 12 12
D D D 15 15 15 1101 1101 1101 13 13 13
E E E 16 16 16 1110 1110 1110 14 14 14
F F F 17 17 17 1111 1111 1111 15 15 15

将16进制转换位2进制时,将每一位16进制替换为4位对应的2进制;若是8进制则替换为3位。
举个例子:
16进制数 ( A C F 4561 ) 16 (ACF4561)_{16} (ACF4561)16的二进制是什么?

ACF4561
1010110011110100010101100111

所以 ( A C F 4561 ) 16 = ( 1010110011110100010101100111 ) 2 (ACF4561)_{16}=(1010110011110100010101100111)_2 (ACF4561)16=(1010110011110100010101100111)2

再举个例子:8进制数 ( 6257134 ) 8 (6257134)_8 (6257134)8的二进制是什么?

6527134
110101010111001011100

所以 ( 6257134 ) 8 = ( 110101010111001011100 ) 2 (6257134)_8=(110101010111001011100)_2 (6257134)8=(110101010111001011100)2

而2进制转换为8进制、16进制也是如此:每3个或4个2进制位(bit)分成一组,然后替换为对应的8进制或16进制数。

如: ( 1001011 ) 2 (1001011)_2 (1001011)2转换为16进制为多少?

01001011
4B

所以 ( 1001011 ) 2 (1001011)_2 (1001011)2= ( 4 B ) 16 (4B)_{16} (4B)16

代码实现

10进制转n进制

C++

string dec_to_m(int n,int m){ //十进制数n转m进制string digit = "0123456789ABCDEF"; //位数if(n == 0){ //如果除完了return "";}return dec_to_m(n / m,m) + digit[n % m]; //依次相除并添加位数
}

Python

def dec_to_m(n,m): #十进制数n转m进制digit = "0123456789ABCDEF" #位数if n == 0: #如果除完了return ""return dec_to_m(int(n / m),m) + digit[n % m] #依次相除并添加位数

n进制转10进制

C++

long long int n_to_dec(string m,int base){ //base进制的数字mreverse(m.begin(),m.end()); //将数字反转过来,方便遍历long long int ans = 0; //十进制的数for(int i = 0;i < m.size();i++){ //遍历每一位int digit; //当前位if('0' <= m[i] and m[i] <= '9'){ //将字符转换为整数digit = m[i] - '0';}else if('A' <= m[i] and m[i] <= 'Z'){ //如果是16进制则需要处理字母digit = m[i] - 'A' + 10;}else if('a' <= m[i] and m[i] <= 'z'){ //如果是16进制则需要处理字母digit = m[i] - 'a' + 10;}ans += pow(base,i) * digit; //依次累加}return ans;
}

Python

其实python可以直接作转换,只要int(number,base)即可。不过这里还是完整写一遍进制转换以方便读者理解。

def n_to_dec(m,base): #base进制的数字mm = m[::-1] #将数字反转过来,方便遍历ans = 0 #十进制的数for i in range(len(m)): #遍历每一位digit = 0 #当前位if ord('0') <= ord(m[i]) <= ord('9'): #将字符转换为整数digit = ord(m[i]) - ord('0')elif ord('A') <= ord(m[i]) <= ord('Z'): #如果是16进制则需要处理字母digit = ord(m[i]) - ord('A') + 10elif ord('a') <= ord(m[i]) <= ord('z'): #如果是16进制则需要处理字母digit = ord(m[i]) - ord('a') + 10ans += base ** i * digit #依次累加return ans

结尾

感谢您的阅读!点个赞再走哦~
还有,祝大家万事如意!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DoWhy:Python 中的因果推断库

DoWhy&#xff1a;Python 中的因果推断库 DoWhy 是一个强大的 Python 库&#xff0c;用于因果推断和因果推断分析。本文将介绍 DoWhy 的基本概念、主要功能和使用方法&#xff0c;帮助读者了解如何利用该库进行因果推断&#xff0c;并解决因果关系的相关问题。 什么是DoWhy&…

MySQL-管理

一、系统数据库 MySQL数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息&#xff08;时区、主从、用户、权限等&#xff09;information_schema提供了访问数据库元数据的各种表…

containerd中文翻译系列(十三)流处理器

处理器 API 处理器是一种二进制 API&#xff0c;可通过内容流工作。 传入的内容流将通过 STDIN 理程序&#xff0c;而流处理程序将在 STDOUT "上输出处理后的数据流。 如果遇到错误&#xff0c;必须通过 STDERR 返回错误信息&#xff0c;同时返回非零退出状态。 可以通…

备战蓝桥杯---动态规划(理论基础)

目录 动态规划的概念&#xff1a; 解决多阶段决策过程最优化的一种方法 阶段&#xff1a; 状态&#xff1a; 决策&#xff1a; 策略&#xff1a; 状态转移方程&#xff1a; 适用的基本条件 1.具有相同的子问题 2.满足最优子结构 3.满足无后效性 动态规划的实现方式…

2024年【R2移动式压力容器充装】考试内容及R2移动式压力容器充装免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试内容参考答案及R2移动式压力容器充装考试试题解析是安全生产模拟考试一点通题库老师及R2移动式压力容器充装操作证已考过的学员汇总&#xff0c;相对有效帮助R2移动式压力容器充装免费试题学…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

网络套件字(理论知识)

一、源IP地址和目的IP地址 上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机&#xff0c;而原IP地址和目的IP地址就是用于标识两个主机的&#xff0c;既然叫做地址必然有着路径规划的作用&#xff0c;而路径规划最重要的就是&#xff0c;从哪来到哪去&#xff0…

【C++】友元:友元函数与友元类

一、友元 友元&#xff08;friend&#xff09;是C中的一种特殊关系&#xff0c;用于在类之间共享访问权限。通过将一个函数或类声明为另一个类的友元&#xff0c;我们可以允许友元访问声明类的非公有成员。 二、友元函数 问题&#xff1a;现在尝试去重载operator<<&am…

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记&#xff08;第一版译文版 2.1章节&#xff09; 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&a…

简单说网络:TCP+UDP

TCP和UPD: (1)都工作在传输层 (2)目的都是在程序之中传输数据 (3)数据可以是文本、视频或者图片(对TCP和UDP来说都是一堆二进制数没有太大区别) 一、区别:一个基于连接一个基于非连接 将人与人之间的通信比喻为进程和进程之前的通信:基本上有两种方式(1)写信;(2)打电话;这…

Docker容器化K8s集群部署教程(一键部署sheel脚本)

本文通过脚本&#xff0c;可以快速地部署和配置Kubernetes环境&#xff0c;省去了各插件手动部署、配置的繁琐过程。 先看最终结果&#xff1a; [rootlocalhost home]# kubectl get node NAME STATUS ROLES AGE VERSION k8smaster Ready control-p…

LlamaIndex 入门实战

文章目录 LlamaIndex 入门实战1. 基本概念2. 优劣势分析3. 简单代码示例4. Index持久化5. 使用场景6. 总结 LlamaIndex 入门实战 LlamaIndex是一个连接大型语言模型&#xff08;LLMs&#xff09;与外部数据的工具&#xff0c;它通过构建索引和提供查询接口&#xff0c;使得大模…

Java学习17-- super类

重点&#xff1a;super类 & 方法重写 super类 super指的是本级的上一级&#xff0c;即father class父类 很好理解&#xff0c;比如Person class>Student class 当前在Student class执行&#xff0c;那么就写this.xxx 需要在Student程序里面调用Person&#xff0c;那就…

HarmonyOS应用/服务发布:打造多设备生态的关键一步

目前 前言HarmonyOS 应用/服务发布的重要性使用HarmonyOS 构建跨设备的应用生态前期准备工作简述发布流程生成签名文件配置签名信息编译构建.app文件上架.app文件到AGC结束语 前言 随着智能设备的快速普及和多样化&#xff0c;以及编程语言的迅猛发展&#xff0c;构建一个无缝…

UMLChina公众号精选(20240207更新)

UMLChina服务 如何选择UMLChina服务 《软件方法》分步改进指南 做对《软件方法》强化自测题获得“软件方法建模师”称号 建模示范视频 [EA-029/石油钻井管理平台]35套UML/SysMLEA/StarUML的建模示范视频-全程字幕 UMLChina连EA经销商都不是&#xff0c;EA水平靠谱嘛&#xff1f…

大数据 - Spark系列《四》- Spark分布式运行原理

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 目录 &#x1f360;…

jmeter-06常用的几种断言方式

文章目录 一、jmeter常用的几种断言二、响应断言1.设置介绍1.1apply to1.2测试字段1.3模糊匹配1.4 测试模式2.举例二、json断言1、响应数据2、断言设置2、postman对比3、断言成功与断言失败的结果图四、持续时间断言1、为什么要做持续时间断言?2、举例

SQLite常用命令

SQLite常用命令 1、查找帮助命令 .help 2、退出SQLite命令 .q .quit .exit 3、显示各种设置的当前值 .show 4、查看表的create模式 .schema .schema name 5、显示当前打开的数据库文件 .database 6、显示数据库中所有的表名 .tables 7、创建或者…

麒麟V10+飞腾处理器源码编译qt

1.下载qt源码 2.百度解压命令,进行解压 3.cd进文件目录 4.使用./configure命令进行配置(重点:记得看说明) Usage: configure [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir <dir>][-docdir <dir>] [-headerdir <dir&g…

sqli-labs-master靶场训练笔记(38-53|boss战)

2024.2.4 level-38 &#xff08;堆叠注入&#xff09; 这题乍一看感觉又是来卖萌的&#xff0c;这不是和level-1一模一样吗 然后仔细看了一下源代码&#xff0c;根据 mysqli_multi_query 猜测这题的本意应该是堆叠注入 mysqli_multi_query() 是 PHP 中用于执行多个 SQL 查…