进制的理解与转换

news/2025/3/9 18:14:51/

进制(binary)是在数学和数字电路中以2为基数的记数系统,这一系统中,通常用两个不同的符号0和1来表示数值。
基本概念
位(bit):二进制数据中的基本单位,每一位只能是0或1。在计算机科学中,一个位通常被称为一个比特(Binary digit的缩写)。
字节(byte):由8个位组成,是计算机中常用的数据单位。一个字节可以表示256种不同的状态(因为2^8=256)。

进制的特点
基数为2:二进制的基数是2,这意味着在二进制系统中,每一位的数值只能是0或1。
进位规则:二进制采用“逢二进一”的进位规则,即当某一位的数值达到2时,需要向高位进位,并将该位重置为0。
借位规则:在二进制中,当需要从一个较小的数中减去一个较大的数时,会发生借位。借位规则是“借一当二”,即从高位借1位来当作2使用。

//举例
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001举个例子,将十进制数23转换为二进制数:23 ÷ 2 = 11 余 1(记录1,这是最低位)
11 ÷ 2 = 5 余 1(记录1,这是次低位)
5 ÷ 2 = 2 余 1(记录1,这是更高位)
2 ÷ 2 = 1 余 0(记录0,这是再高一位)
1 ÷ 2 = 0 余 1(记录1,这是最高位)所以23就是10111

进制
进制(Octal)是一种以8为基数的计数系统,满8近一。

0  ->  00
1  ->  01
2  ->  02
3  ->  03
4  ->  04
5  ->  05
6  ->  06
7  ->  07
8  ->  10
9  ->  11
10 ->  12
11 ->  13
12 ->  14
13 ->  15
14 ->  16
15 ->  17
16 ->  20

16进制
16进制(简写为hex或下标16)是一种数学中常用的数制(记数的方法),它用16个符号来表示数值。这些符号分别是:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中,A到F分别表示10到15。

16进制数的表示形式为:
0x或0X开头(在C、C++、Java等编程语言中常用)
例如:0x1A3F、0XFF1C等

进制的转换

  • 进制转十进制
    将二进制数的每一位从右到左计算乘以2的相应次方(从右到左,次方从0开始增加),然后将这些乘积相加得到十进制数。
比如我们计算1011:
从二进制数的最右边(即最低位)开始,将每一位上的数字乘以2的次方。
最右边的位(第1位)是1乘以2的0次方
得到1。
接着是(第2位)1乘以2的1次方
得到2。
然后是(第3位)0乘以2的2次方
得到0。
最后是(第4位)1乘以2的3次方
得到8。1+2+0+8=11

进制转换为二进制可以采用“除2取余法”
整数部分的转换
将十进制的数字一直除2,得到的商和余数,直到商为0时为止。
将每次得到的余数记录下来,按从低位到高位的顺序排列起来。

//将53转成二进制
第一次除法:用51除以2,得到商26和余数1。
第二次除法:用2去除26,得到商13和余数0。
第三次除法:用2去除13,得到商6和余数1。
第四次除法:用2去除6,得到商3和余数0。
第五次除法:用2去除3,得到商1和余数1。
第六次除法:用2去除1,得到商0和余数1。
组合余数:
将所有记录的余数按从低位到高位的顺序排列起来,表示为110101。

小数部分的转换
乘法运算:
用2乘以十进制小数,然后取整数部分。
剩下的小数部分继续乘以2,然后取整数部分。
如此进行,直到小数部分为零为止(如果永远不能为零,则按照要求保留多少位小数)。
记录整数部分:
在整个乘法运算过程中,将每次得到的整数部分记录下来。
注意整数部分的顺序,先得到的整数部分是二进制数的低位有效位,后得到的整数部分是二进制数的高位有效位。
组合结果:
将所有记录的整数部分按从低位到高位的顺序排列起来(小数点不变),并加上小数点,就得到了该十进制小数的二进制表示(如果要求保留有限位小数)。

以十进制数23.625为例:
整数部分23的转换:
23 ÷ 2 = 11 余 1
11 ÷ 2 = 5 余 1
5 ÷ 2 = 2 余 1
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
将余数按从低位到高位的顺序排列:10011小数部分0.625的转换:
0.625 × 2 = 1.25(取整数部分1)
0.25 × 2 = 0.5(取整数部分0,注意这里我们只取到小数点后第一位,因为原数只有两位小数)
0.5 × 2 = 1.0(取整数部分1,这里已经足够精确到原数的位数)
将整数部分按从低位到高位的顺序排列(并加上小数点):.101
因此,小数部分0.625的二进制表示为0.101(这里我们只保留了三位小数进行演示,实际上可以根据需要保留更多位)。
组合结果:
将整数部分和小数部分的二进制表示组合起来:10111.101
因此,十进制数23.625的二进制表示为10111.101。

原码反码和补码

原码、反码和补码是计算机中用于表示有符号整数(二进制编码)的三种编码方式。

原码

  • 定义:原码是一种最简单的机器数表示法,最高位为符号位,用以表示数值的正负(通常用 0 表示正数,1 表示负数),其余位表示数值的绝对值。
  • 示例:假设用 8 位二进制来表示整数。
    • 对于正数 +10,其原码是 00001010,最高位 0 表示正数,后面 7 位 0001010 是 10 的二进制表示。
    • 对于负数 -10,其原码是 10001010,最高位 1 表示负数,后面 7 位 0001010 同样是 10 的二进制表示。
  • 优缺点:原码的优点是直观易懂,与真值的转换较为简单;缺点是进行加减运算时规则复杂,需要先判断符号位和数值大小,再进行相应操作。

反码

  • 定义:反码的表示规则根据数的正负有所不同。正数的反码与原码相同;负数的反码是在原码的基础上,符号位不变,其余位按位取反(即 0 变为 1,1 变为 0)。
  • 示例:同样以 8 位二进制为例。
    • 正数 +10 的原码是 00001010,其反码也是 00001010
    • 负数 -10 的原码是 10001010,则其反码是 11110101(符号位 1 不变,其余位取反)。
  • 优缺点:反码在一定程度上简化了计算机的运算,但仍然存在 0 的表示不唯一的问题(有 +0 和 -0 之分),并且在运算时还是需要额外处理。

补码

  • 定义:补码的表示规则同样因数的正负而异。正数的补码与原码、反码相同;负数的补码是在反码的基础上加 1。
  • 示例:还是以 8 位二进制表示。
    • 正数 +10 的原码、反码和补码都是 00001010
    • 负数 -10 的原码是 10001010,反码是 11110101,补码则是 11110110(反码 11110101 加 1)。
  • 优缺点:补码解决了 0 的表示不唯一的问题,并且在计算机中可以将减法运算转化为加法运算,大大简化了计算机的运算器设计,提高了运算效率,因此在计算机系统中得到了广泛应用。

总结

原码直观但运算复杂,反码是过渡形式,而补码则解决了原码和反码存在的问题,使得计算机的运算更加高效和统一。


http://www.ppmy.cn/news/1577880.html

相关文章

软考中级-数据库-3.3 数据结构-树

定义:树是n(n>=0)个结点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3...,Tm…,其中每个集合又都是一棵树,并且称为根结点的子树。 树的相关概念 1、双亲、孩子和兄弟: 2、结点的度:一个结…

PX4中的DroneCAN的实现库Libuavcan及基础功能示例

简介 Libuavcan是一个用C编写的可移植的跨平台库,对C标准库的依赖小。它可以由几乎任何符合标准的C编译器编译,并且可以在几乎任何体系结构/OS上使用。 在 DroneCAN 中,Libuavcan 有一个 DSDL 编译器,将 DSDL 文件转换为 hpp 头…

解决java-jar报错:xxx.jar 中没有主清单属性的方法

在使用IDEA 2024.1版本Win11JDK1.8,用springboot做了一个demo,然后用maven打包部署了,打包的jar包在运行的时候,报错,如下图 “没有主清单属性的方法” 参考网址https://www.jb51.net/program/331436ija.htm发现&#…

写一个QGIS插件

编写一个简单的QGIS插件,实现以下功能: 在QGIS界面中添加一个工具栏按钮,点击按钮后能够弹出一个对话框。对话框中包含一个文本框和一个按钮。用户可以在文本框中输入一个字符串,点击按钮后,在QGIS控制台中输出用户输…

在K8S中,svc底层是如何实现的?

在Kubernetes中,Service是集群内部的一个抽象层,用于定义一组Pod的逻辑分组,并提供统一的访问入口点,同时还可以对这些Pod提供负载均衡和网络代理功能。Service底层的实现主要包括以下几个关键组件和技术: 标签选择器…

.NET高级应用---自定义Ioc容器(附带源码)

目录 1. IoC容器对象项目结构的影响 代码体现: 2. IoC容器中的对象依赖注入 代码体现: 3. IoC概念理解与自定义IoC容器 代码体现: 4. 自定义IoC容器的基本控制逻辑 5. IOC瞬态模式与单例模式逻辑整合 代码体现: 6. 无限…

20250307隨筆 使用 A5 SQL 打开 .a5er 文件以及生成建表語句

在 A5:SQL Mk-2 中,拖拽 .a5er 文件后,你可以查询某个表的名称以及生成数据表的 SQL 脚本。以下是具体操作方法: 1. 查找某个表名 如果你已经打开 .a5er 文件,并且看到了 ER 图,你可以用以下方法查找特定表&#xff1…

【RabbitMQ】Producer之TTL过期时间 - 基于AMQP 0-9-1

这篇文章和大家分享Producer发布消息时如何设置消息过期时间,包括队列级别和消息级别,还有如何设置队列的过期时间。 消息过期时间 给消息设置TTL,在超过TTL值后,消息就会变成dead message(死信)&#xf…