CMU-15213(计算机操作系统总结) - 第二章(数据运算)
二进制表示
- 基本上所有东西都可以转换成数据(Binary二进制0和1)来表示
- 通过对0和1的不同形式的编码,我们可以让这些Binary来表示各种类型的数据,比如String,Int,等等
为什么选择二进制表示呢?
其实之前的计算机设计也考虑过十进制作为存储数据的方式,但是很快就发现并没有0和1这种方式来的简单,因为我们可以通过高电压和低电压来表示1和0,这个方法就十分的自然去表示数据。(以后可以做更多讨论)
二进制转换
在介绍二进制转换之前,我们需要先介绍一下我们熟悉的十进制是如何计算的
比如十进制数字162,我们可以表示成
那现在让我们用二进制来表示
MSB是最高有效位,在这里就是
LSB是最低有效位,在这里就是
十六进制转换
十六进制也很常见在计算机,因为二进制表示数字的时候十分不好看,比如说,用二进制表示的话就是
十进制 | 2147483647 |
二进制 | 01111111 11111111 11111111 11111111 |
很明显二进制表示十分不好解读,这时候我们就需要用到十六进制了,十六进制是将每4位二进制进行转换,比如:
Hex(十六进制) | Decimal(十进制) | Binary(二进制) |
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
所以我们可以将转换成二进制,然后再将其转换成十六进制
十进制 | 2147483647 |
二进制 | 0111 1111 1111 1111 1111 1111 1111 1111 |
十六进制 | 7FFFFFFF |
布尔代数(Boolean Algebra)
布尔代数,或者布尔表达是通过用1来表示True,用0来表示False的一种逻辑表示
常见的逻辑表示
与(AND)
AND(符号:'&') | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
或(OR)
OR(符号:'|') |
0 | 1 |
0 | 0 | 1 |
1 | 1 | 1 |
非(NOT)
NOT(符号:'~') | |
0 | 1 |
1 | 0 |
互斥或(XOR,Exclusive-Or )
XOR(符号:'^') | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
在C中的位运算(Bit-Level Operations in C)
举个例子01101001 & 01010101,那么我们需要将这两个数字,每一位和每一位进行与(AND)的运算,如图所示:
01101001 & 01010101 |
0 1 1 0 1 0 0 1 |
0 1 0 1 0 1 0 1 |
0 1 0 0 0 0 0 1 |
那么01101001 | 01010101呢?就是每一位和每一位进行或(OR)的运算,如图所示
01101001 | 01010101 |
0 1 1 0 1 0 0 1 |
0 1 0 1 0 1 0 1 |
0 1 1 1 1 1 0 1 |
那么01101001 ^ 01010101呢?自然就是每一位和每一位进行互斥或(XOR)的运算,如图所示
01101001 ^ 01010101 |
0 1 1 0 1 0 0 1 |
0 1 0 1 0 1 0 1 |
0 0 1 1 1 1 0 0 |
最简单的非运算就是翻转每一位,如果这一位是1翻转成0,如果是0翻转成1
~01101001 |
10010110 |
在C中的逻辑运算(Logic Operations in C)
除了正常的位运算,在C中还有一种逻辑运算符:&&,||,!
这些逻辑运算符和普通运算符的区别是:
- 把0看做FALSE
- 把所有非0的数字看做TRUE
- 总会返回0或者1作为结果
- 早终结(Early termination)
例子:!
!0x41会给我们返回0x00
!0x00会给我们返回0x01
!!0x41会给我们返回0x01
例子:&&
0x69 && 0x55 -> 0x01 |
例子:||
0x69 || 0x55 -> 0x01 |
位移操作
逻辑位移(Logical Shift)
逻辑左移:x << y
将x向左整体位移y位,左边溢出的多余位数忽略,右边补0。
什么意思呢?举个例子:
x | 0101 0011 |
y | 3 |
x << y |
逻辑右移:x >> y
将x向右整体位移y位,右边溢出的多余位忽略,左边补0。
举个例子:
x | 0101 0011 |
y | 3 |
x >> y | 0000 1010 |
算术位移(Arithmetic Shift)
算术位移只有在右移的时候,才会考虑是否使用。
逻辑右移:x >> y
将x向右整体位移y位,右边溢出的多余位忽略,左边补MSB上面的bit,比如说MSB(最高有效位)上是1,那就补1,如果是0,就补0。
什么意思呢?举个例子:
x | 1101 0011 |
y | 3 |
x >> y | 1111 1010 |