比特,字节和整数
课程课件链接:15-213 Lec2:Bits, Bytes, & Integers I
信息表示
在计算机世界,所有的信息都是通过比特进行表示(一切皆比特)。
每一比特的取值要么0,要么是1.
在计算机中通过各种方式对比特集进行编码或者解析。
那为什么是比特来表示信息呢? 电子学实现
- 0或者1的双稳态易于存储
- 在噪声和不正确的线路上可以进行可靠传输
字节
字节(byte), 对应8比特。
字节的表示:
- 二进制表示: 0000000 0 2 00000000_2 000000002 ~ 1111111 1 2 11111111_2 111111112
- 十进制表示: 0 10 0_{10} 010 ~ 25 5 10 255_{10} 25510
- 十六进制表示: 0 0 16 00_{16} 0016 ~ F F 16 FF_{16} FF16
注:
对于十六进制表示法,使用
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
A
,
B
,
C
,
D
,
E
,
F
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F来表示数值
在C语言中,十六进制
F
1
E
2
D
3
C
4
16
F1E2D3C4_{16}
F1E2D3C416数值表示为:
- 0xF1E2D3C4
- 0xf1e2d3c4
十进制和二进制、十六进制之间的对应关系如下表所示
十进制 | 十六进制 | 二进制 |
---|---|---|
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 |
10 | A | 1010 |
11 | B | 1011 |
12 | C | 1100 |
13 | D | 1101 |
14 | E | 1110 |
15 | F | 1111 |
二进制与十六进制之间的转换如下例子
C语言中数据类型表示的例子如下
比特操作
介绍比特操作之前,先学习下布尔代数
布尔代数式逻辑的代数表示, True编码为1,False编码为0。
布尔代数常见的逻辑操作有,与(AND),或(OR), 非(NOT),异或(XOR)
- 与操作,用符号 & 表示,对应的比特与操作如下所示
A | B | A&B |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
- 或操作,用符号 | 表示,对应的比特或操作如下表所示
A | B | A|B |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
- 非操作,用符号 ~ 表示,对应的比特非操作如下表所示
A | ~A |
---|---|
0 | 1 |
1 | 0 |
- 异或操作,用符号 ^ 表示,对应的比特操作如下表所示
A | B | A^B |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
以上是单个比特的操作,对于比特向量的布尔操作则是逐个比特进行布尔逻辑操作,例如
C语言中的比特操作(称之为位操作)有对应比特操作符
- &, 与操作
- | ,或操作
- ~ ,非操作
- ^,异或操作
同时,C语言中有对应的逻辑操作,对应的逻辑操作符为
- &&
- ||
- !
对于逻辑操作符中,0认为是false,其他非0认为是true。
逻辑操作的结果总是True(1)或者False(0)
例如
!0x41 = 0x0
!0x00 = 0x1
!!0x41 = 0x1
0x41 && 0x55 = 0x1
0x41 || 0x55 = 0x1
0x41 && 0x0 = 0x0
0x41 || 0x0 = 0x1
移位操作
- 左移操作
左移表达式一般表示为
x
<
<
y
x << y
x<<y
表示对于比特向量
x
x
x,向左移动
y
y
y个位置。比特向量
x
x
x的高比特位置丢掉y个比特位,右边的低比特位值填充y个0。如下图所示
- 右移操作
右移表达式一般表示为
x
>
>
y
x >> y
x>>y
表示对于比特向量
x
x
x,向右移动
y
y
y个位置。比特向量
x
x
x的低比特位置丢掉y个比特位,左边的高比特位值填充的值由移位类型来决定(逻辑右移和算术右移)。
对于 逻辑右移:左边高比特位填充0
对于 算术右移:使用x的最高比特位进行填充
如下图所示
整数
无符号二进制转为十进制公式如下
B 2 U ( X ) = ∑ i = 0 w − 1 x i ⋅ 2 i B2U(X) = \sum^{w-1}_{i=0} x_{i} \cdot {2}^i B2U(X)=i=0∑w−1xi⋅2i
有符号二进制(二进制补码)转为十进制公式如下
B 2 T ( X ) = − x w − 1 ⋅ 2 w − 1 + ∑ i = 0 w − 2 x i ⋅ 2 i B2T(X) = -x_{w-1} \cdot 2^{w-1} + \sum^{w-2}_{i=0} x_{i} \cdot {2}^i B2T(X)=−xw−1⋅2w−1+i=0∑w−2xi⋅2i
对于有符号数的二进制补码最高比特位是符号位
- 最高比特位 0 : 表示非负数
- 最高比特位 1 : 表示负数