hisasibuli 久しぶり 好久没有更文,但是前段时间偶然的机会申请blog专家,居然通过了!
虽然: 现在大环境不是很好,blog专家也没有实体证书奖励了,不过私人域名、还有无广告这个还挺满意的;
算了: 不多想了反正,本人已经习惯了断断续续的记录文章,研究了一下blog专家的【政策】哦哦,居然还要定期更文;
- 着下不得不被催着,更细了,最近工作比较忙l实在没时间写长文,单页不想水文章,不过貌似【软考】比较火
- 身边也有不少人开始关注,所以决定浅浅尝试一波,后面会慢慢更新【软件设计师】相关的学习blog;
[软件设计师] - 进制转换:
八百里加急,写的🏃♂️🏃♂️ 虽然如此,还是求一波关注点赞~~ Ok 话不多说开始吧!!
关于进制转换: 很久很久之前学习过,不过已经忘记的差不多了…
生活中常见的进制包括:二进制B、八进制O、十进制、十六进制H
-
二进制B: 计算机领域应用广泛,数据以 0 和 1 的形式存储在硬盘、
内存等设备中,逻辑电路中,用高电平表示 1,低电平表示 0 来进行逻辑运算和数据处理;
-
八进制O: 计算机编程和一些系统设置中有时会用到,八进制与二进制之间有简单的转换关系
在早期计算机的一些数据处理和存储中,使用八进制可以更方便地对二进制数据进行分组和表示
-
十进制D: 是日常生活中最常用的进制。在购物时商品的价格标签、货币的计算,如 1 元、5 角、10 分等;
-
十六进制H: 计算机编程中,内存地址、数据的十六进制表示,颜色通常用十六进制代码来表示,如 #FF0000 表示红色
转换十进制:
二进制=十进制
任意进制转换为十进制,通常采用:位权展开法: 即将任意进制数的每一位数字 乘以 该位的位权
在任何一种进制中,每一位数字所代表的数值大小不仅取决于数字本身,还取决于它所在的位置,就是:位权
以二进制 1000011100 举例: 用位权展开法转换==> 十进制:从右往左0开始, 进 制 位权 进制^{位权} 进制位权
从右往左 <————— 第3位数字 0 = 2 2 = 4 2^2=4 22=4
从右往左 <————— 第4个数字 0 = 2 3 = 8 2^3=8 23=8
从右往左 <————— 第5个数字 0 = 2 4 = 16 2^4=16 24=16
从右往左 <————— 第10个数字 0 = 2 9 = 512 2^9=512 29=512 将每一位,数字乘以其位权后:相加即可得十进制 = 540
小数部分转换: 以二进制 1000011100.11 举例: 小数点从左往右1开始: 进 制 − 位权 进制^{-位权} 进制−位权
从左往右 <————— 第1个数字 0 = 2 − 1 = 1 2 2^{-1} = \frac{1}{2} 2−1=21
从左往右 <————— 第2个数字 0 = 2 − 2 = 1 4 2^{-2} = \frac{1}{4} 2−2=41
小数部分转换为十进制为: 1 2 + 1 4 \frac{1}{2} + \frac{1}{4} 21+41 = 0.75 所以:1000011100.11 =转换十进制= 540.75
八进制=十进制
八进制数的位权是以8为底的幂。例如,将八进制 357.2 数转换为十进制
= 7 ∗ 8 0 + 5 ∗ 8 1 + 3 ∗ 8 2 + 2 ∗ 8 − 1 7*8^0 + 5*8^1 + 3*8^2 + 2*8^{-1} 7∗80+5∗81+3∗82+2∗8−1
= 7x1 + 5x8 + 3x64 + 2x 1 8 \frac{1}{8} 81
= 7 + 40 + 192 + 0.25
= 239.25
十六进制=十进制
十六进制数的位权是以16为底的幕,
其中A代表10,B代表11,C代表12,D代表13,E代表14,F代表15. 将十六进制数 2A3.E 转换为十进制:
= 3 ∗ 1 6 0 + 10 ∗ 1 6 1 + 2 ∗ 1 6 2 + 14 ∗ 1 6 − 1 3*16^0 + 10*16^1 + 2*16^2 + 14*16^{-1} 3∗160+10∗161+2∗162+14∗16−1
= 3x1 + 10x16 + 2x256 + 14x 1 16 \frac{1}{16} 161
= 3 + 160 + 512 + 0.875
= 675.875
十进制=任意进制:
十进制转换为任意进制通常采用 除基取余法 和 乘基取整法 前者用于整数部分的转换,后者用于小数部分的转换
整数部分:除基取余法
将十进制整数除以要转换的进制基数,取余数作为转换后进制数的最低位;
然后将商继续除以基数,再取余数作为次低位,以此类推,直到商为 0 为止,最后将余数从下往上排列
,得到转换结果
将十进制数 25 转换为二进制:n\2 余数为 1,这是二进制数的最低位
25/2 = 12 … 1
12/2 = 6 … 0
6/2 = 3 … 0
3/2 = 1 … 1
1/2 = 0 … 1
从下往上排列余数,得到二进制数为:11001
小数部分:乘基取整法
将十进制小数乘以要转换的进制基数,取乘积的整数部分 作为转换后进制数的最高位
然后将乘积的小数部分继续乘以基数,再取整数部分作为次高位,以此类推,
直到小数部分为 0 或达到要求精度;最后将整数部分 从上往下排列
将十进制小数0.625转换为二进制
0.625x2 = 1.25,整数部分为1
0.25 x2=0.5,整数部分为 0
0.5x2=1.0,整数部分为1
从上往下排列整数部分,得到二进制小数为:0.101
十进制=八进制
整数部分:除 8 取余法 + 小数部分:乘 8 取整法 例如,将十进制数 125.6875 转换为八进制
十进制整数除以 8,取余数作为八进制数的最低位
125\8 = 15 … 5
15\8 = 1 … 7
1\8 = 0 ……… 1 从下往上排列余数,得到八进制数为175
小数部位: 十进制小数乘以 8,取乘积的整数部分作为八进制数的最高位
0.6875 x 8 = 5.5,整数部分为5
0.5 x 8 = 4.0,整数部分为4
从上往下排列整数部分,得到八进制小数为0.54,所以十进制:125.6875 =八进制= 175.54
十进制=十六进制
将十进制数 325.8125 转换为十六进制,整数: 将十进制数 325 转换为十六进制:
325\16 = 20 .…… 5
20\16 = 1 .…… 4
1\16 = 0 … 1 从下往上排列余数,得到十六进制数为145
小数部分: 乘 16 取整法,十进制小数
0.8125
转换为十六进制:0.8125 x 16 = 13.0,整数部分为 D
得到十六进制小数为
0.D
所以十进制:325.8125 =十六进制= 145.D
二进制-十六进制:
二进制 = 八进制 = 十六进制 = 都有较为迅速的转换方式:因为: 2 3 = 8 2^3=8 23=8 \ 2 4 = 16 2^4=16 24=16
所以可以将二进制数从右至左,每4位分为一组,若最左边一组不足4位,则在左边补0,
然后将每组二进制数转换为对应的十六进制数字,从左往右组合在一起,举例:1101101011
1101101011 从右至左,每4位分为一组,若最左边一组不足4位,则在左边补0
= 0011 0110 1011
= 0011对应3、0110对应6,1011对应B、所以结果为:36B
小数部分: 从左往右 每 4 位二进制数为一组,不足 4 位的在右边补0,然后将每组二进制数转换为对应的十六进制数字;
例如对于二进制小数0.101101 从左往右每4位一组进行划分,得到10110100
= 1011 0100
= 1011对应的十六进制数是B、0100对应的十六进制数是4
= 所以,二进制小数
0.101101
转换为十六进制是 0.B4
当然也可以通过:间接转换法=二进制=十进制=十六进制
虽然有点麻烦~ 二进制 = 八进制就分三位一组
数据表示:
真数:真数是数学中对数运算里的一个概念
- 在计算机领域指: 人们在日常生活和数学计算中所使用的真实的数,
- 可以是整数、小数、正数、负数等各种形式: 2 + 3 = 5 2+3=5 2+3=5
2 3 5
就是真数、物体的温度为:37.5°C37.5
也是真数;
机器数: 在计算机中的表示形式,计算机只能识别和处理二进制数据,
所以需要将各种真数按照一定规则转换为二进制形式存储和运算
-
无符号数:指在计算机中,所有二进制位 都用于表示数值大小,没有专门的符号位来表示正负的数
都是正数+
表示范围: 对于n位的无符号数,其取值范围是 2 n − 1 2^n-1 2n−1;8 位无符号数的取值范围是0到 2 8 − 1 2^8-1 28−1 即0到255;
-
有符号数:在计算机中,用最高位 作为符号位来表示数的正负,其余位表示数值大小的数,
-
通常规定,符号位0+ 为表示正数,符号位1- 为表示负数
-
比如:十进制 +5 有符号8位表示:00000101
-
十进制 -5 有符号8位表示:10000101
-
机器数特点: 受计算机硬件的限制,
- 机器数的位数是固定的,如 8 位、16 位、32 位、64 位等
- 导致机器数能表示的数值范围是有限的,当运算结果超出这个范围时,就会发生溢出
- 有特定编码方式:为方便计算机进行运算和处理,机器数有多种编码方式,如
原码、反码、补码、移码
等
原码
原码是一种最简单的机器数表示法,最高位为符号位,其中 0 表示正数,1 表示负数,其余位表示数值
-
假设用 8 位二进制表示一个整数:对于十进制数 +5,其原码为
0000 0101
; -
对于十进制数 -5,其原码为
1000 0101
小数原码表示: 通常规定小数点在符号位之后,最高数值位之前
-
正小数: 符号位为 0,后面跟着小数部分的二进制表示:对于正小数 +0.625,将 0.625 转换为二进制是
0.101
用 8 位表示,原码就是
0
.1010000
(小数点在符号位之后,此处书写时保留小数点,实际存储无小数点) -
负小数: 符号位为 1,后面跟着小数绝对值部分的二进制表示:
对于负小数 -0.625,其 8 位原码是 1.1010000
优点: 直观易懂:原码与真值之间的对应关系非常直观,很容易从原码直接看出其表示的数值大小和正负;
在原码表示中,存在 “+0” 和 “-0” 两种表示形式。例如,8 位二进制中,00000000 表示 +0,10000000 表示 -0
反码
正数的反码与原码相同; 负数的反码是在其原码的基础上,
符号 位保持不变,其余各位取反(即 0 变为 1,1 变为 0)
假设使用 8 位二进制来表示整数:
- 对于正数 +5,原码是 00000101,由于正数的反码与原码相同,所以 +5 的反码也是 00000101
- 对于负数 -5,原码是 10000101,符号位不变,其余位取反后得到反码 11111010
通过反码,减法可以转换为加法来处理,在早期的计算机设计中,这种特性有助于降低硬件实现的复杂度
缺点:存在 “+0” 和 “-0” 两种表示形式, 例如,8 位二进制中,+0 的反码是 00000000,-0 的反码是 11111111
补码
正数的补码与原码相同;负数的补码是在其反码的基础上加 1
- 正数 +5 的原码、反码和补码都是 00000101
- 负数 -5 的原码是 10000101,反码是 11111010,补码则是在反码的基础上加 1,即 11111011
解决了反码中 “+0” 和 “-0” 表示不唯一的问题。在补码表示中,0 只有一种表示形式,即 00000000——人为定义
移码
移码通常用于表示浮点数的阶码,它是在补码的基础上,将符号位取反得到的
- 对于真值 +5,其补码是 0 0000101,将符号位取反后得到移码1 0000101
- 对于真值 -5,其补码是 1 1111011,符号位取反后得到移码 0 1111011
移码的一个重要特性是可以直观地比较大小。移码大的对应的真值也大
在浮点数的阶码比较中非常有用,方便计算机快速判断浮点数的大小关系
定点小数
定点小数是指小数点位置固定的小数表示方法:
计算机中,通常将小数点固定在最高数位之前、符号位之后,用于表示绝对值小于 1 的纯小数
-
原码表示: 正数 +0.625,将 0.625 转换为二进制是 0.101——8 位原码表示为 0.1010000
对于小数 -0.625,其8位原码是 1.1010000
-
反码表示:符号位不变,其余数值位取反
+0.625 的原码是 0.1010000,其反码同样是 0.1010000
-0.625 的原码是 1.1010000,则反码为 1.0101111.
-
补码表示:正数的补码与原码一样;负数的补码是在其反码的基础上加 1
+0.625 的原码、反码、补码都是 0.1010000、-0.625 的反码是 1.0101111,补码则是 1.0110000(反码加 1)。
-
移码表示: 补码的基础上把符号位取反:+0.625 的补码是0.1010000,其移码是1.1010000
-0.625的补码是 1.0110000,移码是 0.0110000
数据的表示:
码制 | 定点整数 | 定点小数 | 数码个数 |
---|---|---|---|
原码 | − ( 2 n − 1 − 1 ) -(2^{n-1}-1) −(2n−1−1) ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n−1−1) | − ( 1 − 2 n − 1 ) -(1-2^{n-1}) −(1−2n−1) ~ + ( 1 − 2 n − 1 ) +(1-2^{n-1}) +(1−2n−1) | 2 n − 1 2^n-1 2n−1 |
反码 | − ( 2 n − 1 − 1 ) -(2^{n-1}-1) −(2n−1−1) ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n−1−1) | − ( 1 − 2 n − 1 ) -(1-2^{n-1}) −(1−2n−1) ~ + ( 1 − 2 n − 1 ) +(1-2^{n-1}) +(1−2n−1) | 2 n − 1 2^n-1 2n−1 |
补码 | − 2 n − 1 -2^{n-1} −2n−1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n−1−1) | − 1 -1 −1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n−1−1) | 2 n 2^n 2n |
移码 | − 2 n − 1 -2^{n-1} −2n−1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n−1−1) | − 1 - 1 −1 ~ + ( 2 n − 1 − 1 ) +(2^{n-1}-1) +(2n−1−1) | 2 n 2^n 2n |
- n-1 次幂,因为最高位是符号位所以 N-1
- 因为原码反码存在 +0 -0 情况所以,在N位计算机中,需要 -1
- 而 补码、移码没有 -0 的情况,所以负号范围不需要 -1,定点小数是不大于1的,所以需要 1-
浮点数的表示:
一般出现在高级,中级几乎遇不到、了解一下;
浮点数是计算机科学中用于表示实数的一种数据类型,
它特别适用于需要表达非常大或非常小的数值以及进行复杂数学运算的场景,浮点数的表示方法基于科学计数法
浮点数 的表示: N = 尾数 ∗ 基 数 指数 N=尾数*基数^{指数} N=尾数∗基数指数 举例子: 1.25 * 1 0 6 10^6 106
-
尾数:尾数指的是小数点后的数字部分,它代表了:数值的精度
计算机内部,为了节省存储空间,浮点数的尾数通常会隐含一个前导的1
实际存储时不包括这个1,例如,单精度浮点数的尾数部分实际上存储的是0.1234的形式,但理解为1.1234
-
基数:基数是指在数的表示中使用的数制的基础;
二进制浮点数中,基数通常是2、十进制科学计数法中,基数是10
指数(阶码):指数表示尾数需要乘以基数的 多少次幂,指数部分通常经过偏移处理,以便于表示和计算
尾数一般用补码表示(也可以用原码)、基数(阶码)用移码表示,
对阶时,小数向大数看齐,对阶是通过较小数的尾数右移实现的
阶码的位数决定数的表示范围,位数越多范围越大,
尾数的位数决定数的有效精度,位数越多精度越高
浮点数 运算规则:加减法运算
-
对阶: 将两个浮点数的指数调整为相同的值,
将指数较小的数的尾数右移相应的位数,使其指数与另一个数相同
1.23 ∗ 1 0 2 + 4.56 ∗ 1 0 3 1.23*10^2 + 4.56*10^3 1.23∗102+4.56∗103 需要将 1.23 ∗ 1 0 2 1.23*10^2 1.23∗102 转换为 0.123 ∗ 1 0 3 0.123*10^3 0.123∗103
-
尾数运算: 对阶后,将两个数的尾数进行加法或减法运算 0.123 ∗ 1 0 3 + 4.56 ∗ 1 0 3 0.123*10^3+4.56*10^3 0.123∗103+4.56∗103 计算尾数:0.123+4.56 = 4.683
-
结果格式化: 检查运算结果是否需要进行规格化处理,规格化的目的是确保尾数的绝对值在1到10之间(对于十进制浮点数)
如果尾数绝对值大于等于10,则需要尾数右移一位,并将指数加1,
如果尾数的绝对值小于1,则需要将尾数左移一位,指数减1
🆗 🆗 如此结束,求关注——后面会持续更新,【软件设计师】 的blog - 最后祝愿大家,顺利上岸~~