本文主要是介绍chapter1_数制和码制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.简介
- 2.常用的数制
- 2.1 十进制
- 2.2 二进制
- 2.3 八进制
- 2.4 十六进制
- 3.不同进制之间的转换
- 3.1 二—十进制
- 3.2 十—二进制
- 3.3 十六—二进制
- 3.4 二—十六进制
- 3.5 八进制数与二进制数的转换
- 3.6 十六进制数与十进制数的转换
- 4.二进制算数运算
- 4.1 反码、补码和补码运算
- 5.几种常用的编码
- 5.1 BCD码(8421码)
- 5.2 余3码
- 5.3 2421码和5211码
- 5.4 格雷码(Gray Code)
- 5.5 美国信息交换标准代码(ASCII)
1.简介
数字信号:
某物理量在时间上的变化是不连续的,变化的数值大小和每次增减的变化都是某一个最小数量单位的整数倍,小于这个歌最小数量单位没有任何物意义。我们把这一类物理量成为数字量,而表示数字量的信号称为数字信号。
模拟信号:
物理量的变化在时间上或树枝上则是连续的。我们把这类物理量称为模拟量,把表示模拟量的信号称为模拟信号。
2.常用的数制
2.1 十进制
在十进制中,每个位有0-9个数码,所以计数的基数是10。超过9的数必须用多位数表示,其中低位和相邻高位之间的关系是“逢十进一”,故称为十进制。
D = ∑ k i × 1 0 i D = \sum k_i \times 10^{i} D=∑ki×10i
2.2 二进制
目前在数字电路中应用最广泛的是二进制。在二进制数中每一位仅有0和1两个可能的数码,所以计数基数为2低位和相高位间的进位关系是“逢
二进一”,故称为二进制。
D = ∑ k i 2 i D = \sum k_{i} 2^{i} D=∑ki2i
2.3 八进制
八进制数的每一位有 0~7 八个不同的数码,计数的基数为8。低位和相邻的高位之间的进位关系是“逢八进一”。任意个八进制数可以按十进制数展开为
D = ∑ k i 8 i D = \sum k_{i}8^{i} D=∑ki8i
2.4 十六进制
十六进制数的每一位有十六个不同的数码,分别用0~9、A(10)、B(11)、C(12)、D(13)、E(14)、F(15)表示。因此,任意一个十六进制数均可展开为
D = ∑ k i 1 6 i D = \sum k_i 16^i D=∑ki16i
不同进制对照表:
3.不同进制之间的转换
3.1 二—十进制
( 1011.01 ) 2 = 1 × 2 3 + 1 × 2 1 + 1 × 2 0 + 0 × 2 − 1 + 1 × 2 − 2 = ( 11.25 ) 10 (1011.01)_{2} = 1\times2^3 + 1\times2^1+1\times2^0+0\times2^{-1}+1\times2^{-2}=(11.25)_{10} (1011.01)2=1×23+1×21+1×20+0×2−1+1×2−2=(11.25)10
3.2 十—二进制
假设十进制 ( S ) 10 (S)_{10} (S)10和二进制数数为 ( k n k n − 1 . . . k 0 ) (k_nk_{n-1}...k_0) (knkn−1...k0),则可知等式:
( S ) 10 = k n 2 n + k n − 1 2 n − 1 + . . . + k 1 2 1 + k 0 2 0 = 2 ( k n 2 n − 1 + k n − 1 2 n − 2 + . . . + k 1 ) + k 0 \begin{align} (S)_{10} = k_n2^n+k_{n-1}2^{n-1}+...+k_12^1+k_02^0\newline =2(k_n2^{n-1}+k_{n-1}2^{n-2}+...+k1)+k0 \end{align} (S)10=kn2n+kn−12n−1+...+k121+k020=2(kn2n−1+kn−12n−2+...+k1)+k0
上述公式表明,若将 ( S ) 10 (S)_{10} (S)10除以2,那么商就是 k n 2 n − 1 + k n − 1 2 n − 2 + . . . + k 1 k_n2^{n-1}+k_{n-1}2^{n-2}+...+k1 kn2n−1+kn−12n−2+...+k1,余数就是 k 0 k_0 k0。同理可以把得到的商在除以2,余数即为k1:
k n 2 n − 1 + k n − 1 2 n − 2 + . . . + k 1 = 2 ( k n 2 n − 2 + k n − 1 2 n − 3 + . . . + k 2 ) + k 1 \begin{align} k_n2^{n-1}+k_{n-1}2^{n-2}+...+k1=2(k_n2^{n-2}+k_{n-1}2^{n-3}+...+k_2)+k1 \end{align} kn2n−1+kn−12n−2+...+k1=2(kn2n−2+kn−12n−3+...+k2)+k1
依次类推,反复将每次得到的商再除以2,则所得余数为 k i k_i ki.
例如,将 ( 173 ) 10 (173)_{10} (173)10化为二进制数可以进行如下运算,得到的结果 ( 173 ) 10 = ( 10101101 ) 2 (173)_{10} = (10101101)_2 (173)10=(10101101)2
上面是整数的转换方式,而小数的转换方式,是该是怎么样的呢?
同理,参考上面,我们可以假设 ( S ) 10 (S)_{10} (S)10是 一个十进制的小数,那么与之相等的二进制的系数 k − 1 k − 2 . . . k − m k_{-1}k_{-2}...k_{-m} k−1k−2...k−m,则可得:
( S ) 10 = k − 1 2 − 1 + k − 2 2 − 2 + . . . + k − m 2 − m \begin{align} (S)_{10} = k_{-1}2^{-1}+k_{-2}2^{-2}+...+k_{-m}2^{-m} \end{align} (S)10=k−12−1+k−22−2+...+k−m2−m
两边同时乘2,所得到的整数部分即为 k 1 k_1 k1:
2 ( S ) 10 = 2 ( k − 1 2 − 1 + k − 2 2 − 2 + . . . + k − m 2 − m ) = k − 1 + k − 2 2 − 1 + . . . + k − m 2 − m + 1 \begin{align} 2(S)_{10} = 2(k_{-1}2^{-1}+k_{-2}2^{-2}+...+k_{-m}2^{-m})\newline =k_{-1}+k_{-2}2^{-1}+...+k_{-m}2^{-m+1} \end{align} 2(S)10=2(k−12−1+k−22−2+...+k−m2−m)=k−1+k−22−1+...+k−m2−m+1
同理两边同时乘2,所得到的整数为 k 2 k_{2} k2,即乘积的整数部分就是 k − 2 k_{-2} k−2:
2 ( k − 2 2 − 1 + . . . + k − m 2 − m + 1 ) = k − 2 + k − 3 2 − 2 . . . + k − m 2 − m + 2 \begin{align} 2(k_{-2}2^{-1}+...+k_{-m}2^{-m+1})\\ = k_{-2}+k_{-3}2^{-2}...+k_{-m}2^{-m+2} \end{align} 2(k−22−1+...+k−m2−m+1)=k−2+k−32−2...+k−m2−m+2
综上,每次乘2后所得整数部分最高位,小数部分乘2,是小数次高位,依次类推,就可以求出二进制小数的每一位。
例如将 ( 0.815 ) 10 (0.815)_{10} (0.815)10转为2进制,如下所示, ( 0.815 ) 10 = ( 0.1101 ) 2 (0.815)_{10} = (0.1101)_2 (0.815)10=(0.1101)2
3.3 十六—二进制
十六 -二转换是指将十六进制数转换为等值的二进制数。转换时只需将十六进制数的每一位用等值的4 位二进制数代替就行了。
例如,将(01011110.10110010)化为十六进制数时可得:
3.4 二—十六进制
转换是指将十六进制数转换为等值的二进制数。转换时只需将十六进制数的每一位用等值的4 位二进制数代替就行了。
例如,将(8FA.C6)化为二进制数时得到:
3.5 八进制数与二进制数的转换
在将二进制数转换为八进制数时,只要将二进制数的整数部分从低位到高位每3 位分为一组并代之以等值的八进制数,同时将小数部分从高位到低位每
位分为一组并代之以等值的八进制数就可以了。
例如,若将( 011110.010111),化为八进制数,则得到:
反之,若将八进制数转换为二进制数,则只要将八进制数的每一位代之以等值的二进制数即可。例如,将(52.43)。转换为二进制数时,得到
3.6 十六进制数与十进制数的转换
在将十六进制数转换为十进制数时,可根据下面的公式将各位按权展开后相加求得。
在将十进制数转换为十六进制数时,可以先转换为二进制数,然后再将得到的二进制数转换为等值的十六进制数。
D = ∑ k i 1 6 i D = \sum k_i 16^i D=∑ki16i
4.二进制算数运算
当两个二进制数码表示两个数量大小时,它们之间可以进行数值运算,这种运算称为算术运算。二进制算术运算和十进制算术运算的规则基本相同,唯一的区别在于二进制数是“逢二进一”而不是十进制数的“逢十进一“。
例如,两个二进制数1001和0101的算术运算有
如果我们再能设法将减法操作转化为某种形式的加法操作,那么加、减、乘、除运算就全部可以用“移位”和“相加”两种操作实现了。利用上述特点能使运算电路的结构大为简化。
4.1 反码、补码和补码运算
原码:在二进制前面加上1位符号位,符号位0表示这个数是正数,符号1表示这个数是负数。这种形式的数就是原码。
在做减法时,首先要比较两个数的绝对值,然后以最大数为被减数,绝对值小的作为减数,作差,得到的结果以绝对值最大的数的符号作为差值的符号;
为了让减法变的简单,能让加法代替减法么?举个例子,当现在的时间是5点,但手表确显示10点,那怎么调回5点呢?两种方法:
10 − 5 = 5 10 + 7 = 17 − 12 = 5 \begin{align} 10 - 5 = 5 \newline 10 + 7 = 17-12=5 \end{align} 10−5=510+7=17−12=5
由上可知,7就是-5关于12的补码。在舍弃进位的情况下,减去某个数,可以用加上他的补码来代替。再比如,1011-0111= 0100的减法运算,可以用1011+1001=0100的加法来代替。因为4位二进制的进位基数是16(10000),所以1001(9)恰好是0111(7)对模16的补码。
基于上述原理,对于有效数字(不包括符号位)为n位的二进制数,它的补码 ( N ) C O M P (N)_{COMP} (N)COMP表示方法为:
( N ) C O M P = { 2 n − N ( 当 N 为负数 ) N ( 当 N 为正数 ) (N)_{COMP} = {\{^{N\quad(当N为正数)}_{2^{n}-N\quad(当N为负数)}} (N)COMP={2n−N(当N为负数)N(当N为正数)
即正数的补码等于原码,负数(当符号位为1)的补码等于 2 n − N 2^n-N 2n−N。为了避免在求补码的过程中做减法,通常是先求出N的反码 ( N ) I N V (N)_{INV} (N)INV,然后在反码的基础上加1得到补码。反码的定义如下:
N I N V = { N ( 当 N 为正数 ) ( 2 n − 1 ) − N ( 当 N 为负数 ) N_{INV} = \left\{ \begin{align} N\quad (当N为正数)\\ (2^n - 1)-N\quad(当N为负数) \end{align} \right. NINV={N(当N为正数)(2n−1)−N(当N为负数)
由上式可知,当N为负数时, N + ( N ) N V I = 2 n − 1 N+(N)_{NVI} = 2^n -1 N+(N)NVI=2n−1,而 2 n − 1 2^n-1 2n−1是n位全为1的数,也就说,N和N的反码加起来全为1(当N为负数)。所以反码的求法就出来了:只需要把N中的每一位0变1,1变0,就得到了反码 N I N V N_{INV} NINV
当N为负数时, N I N V + 1 = 2 n − N N_{INV}+1 = 2^n - N NINV+1=2n−N,而在上面中,当N为负数时, ( N ) C O M P = 2 n − N (N)_{COMP} = 2^n - N (N)COMP=2n−N,综上可得:
N I N V + 1 = N C O M P N_{INV} + 1 = N_{COMP} NINV+1=NCOMP
即,二进制的负数的补码等于它的反码加1。
例子:写出带符号位二进制数00011010(+26)、10011010(-26)、00101101(+45)和10101101(-45)的反码和补码:
原码 | 反码 | 补码 |
---|---|---|
00011010 | 00011010 | 00011010 |
10011010 | 11100101 | 11100110 |
00101101 | 00101101 | 00101101 |
10101101 | 11010010 | 11010011 |
5.几种常用的编码
为了用二进制代码表示十进制的0-9的十个状态,二进制代码只要需要4bit,而4bit的二进制表示范围在(0000-1111),有16个状态。那具体取哪10个状态来表示0~9,有许多方案,如下:
5.1 BCD码(8421码)
8421码又称BCD(Binary Coded Decimal)码,是十进制代码中最常见的代码之一。在BCD码中,从左到右的每一位1分别表示8、4、2、1,所以也称为8421码;每一位的1代表的十进制数称为这一位的权,8421码中每一位的权重是固定不变的,所以属于恒权编码。
注意
:8421码和普通二进制码的区别:
- 8421码:
- 用于表示十进制数字,每个数字的表示固定为4位二进制
- 主要用于数字显示和某些计算机系统中需要表示二进制数字的场景
- 普通二进制码:
- 用于表示任何整数,位宽根据需要而定
- 更加灵活,可以表示任何范围的整数
举例说明:要表示十进制“12",普通二进制是0110,而8421码s是将1和2分开表示,即”0001 0010“.
5.2 余3码
余3码的编码规则与BCD码不同,如果把每一个余3码看做4位二进制数,则它的数值要比它所表示的十进制数码多3,故而将这种代码称为余3码。
如果将两个余3码相加,所得的和将比十进制数和所对应的二进制多6。因此在使用余3码做加法运算时,若两数之和为10,正好等于二进制的16,于是便从高位自动产生进位信号。
此外,从上面表中可以看出,0和9、1和8、2和7、3和6、4和5的余3码互为反码,这对于求取10的补码是更方便的,这就是余3码的反码性质。在求取十进制数的10的补码时,可以先求取该数的9的补码,再加1。
对于任何十进制数x
,求其10的补码的步骤如下:
- 求该数的余3码
- 求其反码(即找到余3码的互补对)
- 将反码加1
实例,我们要计算十进制数6的10的补码:
- 十进制数6的余3码是
1001
。 - 6的反码是3的余3码,即
0110
。 - 将反码
0110
加1得到0111
。 0111
是十进制数4的余3码。
因此,6的10的补码是4。通过利用余3码的反码性质,可以方便地求取10的补码。这种方法比直接用二进制或BCD(十进制编码)的方式更直观和简洁。
余 3 循环码是一种变权码每一位的1在不同代码中并不代表固定的数值。它的主要特点是相邻的两个代码之间仅有一位的状态不同。
5.3 2421码和5211码
2421 码是一种恒权代码,它的0和91和82和73 和64和5也为反码,这个特点和余3 码相仿。
5211 码是另一种恒权代码。待学了第六章中计数器的分频作用后可以发现,如果按 8421 码接成进制计数器则连续输入计数脉冲时,4 个触发器输出脉冲对于计数脉冲的分频比从低位到高位依次为 5:2:1:1。可见5211 码每位的权正好与8421 码十进制计数器 4 个触发器输出脉冲的分频比相对应。这种对应关系在构成某些数字系统时很有用。
5.4 格雷码(Gray Code)
格雷码(Gray Code)又称循环码,从表中可以看出格雷码的构成方法:格雷码的每一位的状态变化都是按照一定的顺序循环。例如,从0000开始
- 最右边一位的状态按照0110顺序变化
- 右边第二位的状态按照001111100顺序变化
- 右边第三位的状态按照0000111111110000顺序变化
可见规律,从右向左,每一位状态循环中连续的0、1数目增加一倍。由于4位格雷码只有16个,所以坐左边的状态只有半个循环,即:
- 右边第四位的状态按照0000000011111111顺序变化
格雷码优点:
格雷码按照编码顺序依次变化时,相邻两个代码之间只有一位发生变化。这样在代码转换工程中就不会产生过渡“噪声”。
那普通的二进制码怎么会产生过渡噪声呢?
比如上面图中第四行普通二进制编码转换为第五行编码“0011”->“0100”,如果最右边一位的变化比其他两位慢,就会出现一个瞬时的“0101”桩体,这个状态将会成为转换为过程中出现的噪声。而第四行的格雷码“0010”转换为第五行编码“0110“过程中因为只有1位发生变化就不会出现过渡噪声。
十进制代码中的余3循环码就是取4位格雷码中的十个代码组成的,因此它仍然具有格雷码的优点,即两个相邻的编码之间仅有1位不同。
5.5 美国信息交换标准代码(ASCII)
美国信息交换标准代码(American Standard Code for Information Interchange,简称ASCII码)是由美国国家标准协会(ANSI)制定的一种信息代码广泛地用于计算机和通信领域中。
ASCII编码是由一组7位二进制代码 ( b 7 b 6 b 5 b 4 b 3 b 2 b 1 ) (b_7b_6b_5b_4b_3b_2b_1) (b7b6b5b4b3b2b1),共128个,其中包括表示0-9的十个代码,表示大小写英文字母的52个代码,32个表示各种符号的代码以及34个控制代码。具体代码如下所示:
而ASCII码对应34个控制代码的具体含义如下:
这篇关于chapter1_数制和码制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!