数字逻辑的一些基本运算和概念
进制转换
基数:计数制中所用到的数字符号的个数,比如基数为R的计数制中,含0,1···R-1共R个数字符号,进位规律是“逢R进1”,称为R进制。
位权:在一种进位计数制表示的数中,用来表明不同数位上数值大小的一个固定的常数。不同数位有不同的位权。
比如2进制:10001,第一个1位上的位权为 2^4,第二个1位上的位权为 2^0。
并列表示法:比如 1001001.
多项式表示法:按权展开:1 x 2^6 + 1 x 2^3 + 1 x 2^0.
二转十
10110.101 = 1x2^4 + 1x2^2 + 1x2^1 + 1x2^-1 + 1x2^-3 = 16 + 4 + 2 + 0.5 + 0.125.
十转二
整数转换,除基数取余法:
45 ÷ 2 = 22 ··· 1
22 ÷ 2 = 11 ··· 0
11 ÷ 2 = 5 ··· 1
5 ÷ 2 = 2 ··· 1
2 ÷ 2 = 1 ··· 0
1 ÷ 2 = 0 ··· 1
得到45的二进制 1 0 1 1 0 1,注意,按照从下往上的顺序。
小数转换,乘二取整法:
0.6875
x 2
------
1.3750 ··· 1
x 2
------
0.7500 ··· 0
x 2
------
1.5000 ··· 1
x 2
------
1.0000 ··· 1
0.6875的二进制 0.1011,注意,按照从上向下的顺序。
有些时候,无法用有限位二进制表示十进制的小数,就要根据题目的精度要求,将最低位进一然后舍去。
此外,当一个十进制既有整数也有小数,只要把它们分开计算就好了。
八进制,和十六进制,类比即可。需要注意的是:
- 八转二的时候,每一位八进制数 用三位二进制表示即可,比如 732 -> 111 011 010;十六转二用4位二进制数即可。
- 二转八的时候,不足补0,比如 二进制 1001 需要看做 001 001 再转成 11。
- 二转十六的时候,数字十到十五需要用 A - E 表示。
原码,补码,反码
计算机涉及数字的符号问题的时候,需要补充一位符号位,一般在二进制数的最左边,以1为负,以0为正。
原码:
小数:
大于0的小数X,原码为其本身;小于0的小数X,原码为 1-X(相当于在小数点前面补1)。比如:0.1011 -> 0.1011;-0.1011 -> 1.1011
整数:
大于0为它本身,或者在最高位前面补0;小于0在最高位的前面补1。比如:1101 -> 01101;-1101 -> 11101。
反码:
正数的反码为它本身;负数的反码:符号位不变,其他位按位取反。比如:0101111 -> 0101111;1101111 -> 1010000.
整数的方法和小数的方法一样,只不过小数多加了一步,将符号变成小数点前面的1.
补码:
正数与原码,补码一样;负数为取反码之后在最低位+1,有进位则进位;小数和整数一样。
补码反码的计算:
反码的计算
无论进行加还是减的运算,均可以通过加法实现。运算的时候,符号位一起参与计算。
当符号位发生进位的时候,需要将进位加到运算结果的最低位,才能得到结果。
111
+ 111
-----
1 110
--->1
-----
111
补码的计算
与反码的计算不一样的地方在于,符号位发生进位的时候,将其丢弃。
111
+ 111
-----
1 110
->Drop
-----
110
几种常用的BCD编码
目的:为了满足计算机使用二进制,而同时满足人们习惯十进制的需求,通常用四位二进制代码对十进制数字进行编码。称为 二-十进制代码。
又称BCD码,具有二进制的形式,又有十进制的特点。
十进制有 0-9 十个数字,就需要四位二进制来表示,一共 2^4 = 16种表示,就会有多余的六个二进制表示。
不管哪种方案都会有多余的六个表示。
分为有权码 和 无权码,有权码是用数字表示的名字,比如8421码,8421就是它的权值。
8421
权:8421;按照最简单的二进制进位来表示。
0 0000
1 0001
2 0010
3 0011
4 0100
------
5 0101
6 0110
7 0111
8 1000
9 1001
多余的无效码:1010 -> 1111
转换样例:
(1)258 -> 0010 0101 1000 注意,十进制的每一位都要用四位二进制表示,并且不能舍去0!
(2)0001 0010 0000 1000 -> 1208 按权转换,相加即可,比如 0010 = 8x0 + 4x0 + 2x1 + 1x0,就是BCD码的名字。
如果在计算的过程中,出现了无效位,需要加6(0110)来得到正确的结果。
2421
权:2421;求法:0-4和8421一致,从5开始(比如取到了k,5<=k<=9),计算 9-k 的值,得到 9-k 的2421表示(和8421一样),然后按位取反。
比如 求6的2421码:9 - 6 = 3;3的2421码 和 3的8421码一样 = 0011;按位取反 = 1100.
因此,2421码是 对9的自补代码。
0 0000
1 0001
2 0010
3 0011
4 0100
------
5 1011
6 1100
7 1101
8 1110
9 1111
多余的无效码:0101 -> 1010
转换样例:
(1)258 -> 0010 1011 1110
(2)0010 0001 1110 1011 -> 2 1 8 5
0010 = 2x0 + 4x0 + 2x1 + 1x0;1110 = 2x1 + 4x1 + 2x1 + 1x0
5421
权:5421;求法:前面五个 0-4 一样,最后五个,最高位取1,其它三位搬下来。
比如 求5:5找0,0的表示为 0000,那么最高位置1,其它三位搬0000的后三位,形成 1000,就是5的5421码了。
0 0000
1 0001
2 0010
3 0011
4 0100
------
5 1000
6 1001
7 1010
8 1011
9 1100
多余的无效码:0101 -> 0111(3个);1101 -> 1111(3个)
转换样例:
(1)258 -> 0010 1000 1011
(2)0010 0001 1100 1011 -> 2 1 9 8
0010 = 5x0 + 4x0 + 2x1 + 1x0;1100 = 5x1 + 4x1 + 2x0 + 1x0
无权码:余3码
就是8421码+3。它也是对9的自补代码。
0 0011
1 0100
2 0101
3 0110
4 0111
------
5 1000
6 1001
7 1010
8 1011
9 1100
多余的无效码:0000 -> 0010;1101 -> 1111
转换样例:
(1)258 -> 0101 1000 1011
(2)1000 1001 1001 1011 -> 5 6 6 8
1000 = 8x1 + 4x0 + 2x0 + 1x0 - 3 = 5;1001 = 8x1 + 4x0 + 2x0 + 1x1 - 3 = 6
注意,如果计算没有涉及到进位,则需要-3,如果涉及到进位,则要先按照8421码的更改+6 然后再-3,也就是 +3。
2016/9/9