CMU-15213(计算机操作系统总结) - 第二章(数据运算)

CMU-15213(计算机操作系统总结) - 第二章(数据运算)

二进制表示

  • 基本上所有东西都可以转换成数据(Binary二进制0和1)来表示
  • 通过对0和1的不同形式的编码,我们可以让这些Binary来表示各种类型的数据,比如String,Int,等等

为什么选择二进制表示呢?

其实之前的计算机设计也考虑过十进制作为存储数据的方式,但是很快就发现并没有0和1这种方式来的简单,因为我们可以通过高电压和低电压来表示1和0,这个方法就十分的自然去表示数据。(以后可以做更多讨论)

二进制转换

在介绍二进制转换之前,我们需要先介绍一下我们熟悉的十进制是如何计算的

比如十进制数字162,我们可以表示成162_{10}=1*10^2+6*10^1+2*10^0

那现在让我们用二进制来表示162_{10}=1*2^7+1*2^5+1*2^1=10100010_2

MSB是最高有效位,在这里就是(1)0100010_2

LSB是最低有效位,在这里就是1010001(0)_2

十六进制转换

十六进制也很常见在计算机,因为二进制表示数字的时候十分不好看,比如说2147483647_{10},用二进制表示的话就是

十进制 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_{10}转换成二进制,然后再将其转换成十六进制

十进制 2147483647
二进制 0111 1111 1111 1111 1111 1111 1111 1111
十六进制 7FFFFFFF

布尔代数(Boolean Algebra)

布尔代数,或者布尔表达是通过用1来表示True,用0来表示False的一种逻辑表示

扫描二维码关注公众号,回复: 12422444 查看本文章

常见的逻辑表示

与(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 010 1001 1000

逻辑右移:x >> y

将x向右整体位移y位,右边溢出的多余位忽略,左边补0。

举个例子:

x 0101 0011
y 3
x >> y 0000 1010 011

算术位移(Arithmetic Shift)

算术位移只有在右移的时候,才会考虑是否使用。

逻辑右移:x >> y

将x向右整体位移y位,右边溢出的多余位忽略,左边补MSB上面的bit,比如说MSB(最高有效位)上是1,那就补1,如果是0,就补0。

什么意思呢?举个例子:

x 1101 0011
y 3
x >> y 1111 1010 001

猜你喜欢

转载自blog.csdn.net/weixin_38838143/article/details/113157696
今日推荐