前言
在进入本章节之前,需要先理解进制的本质、逻辑运算(与、或、异或、非)。
简单来说,进制就是一组由n个符号组成的逢n进1的规则,其本质就是查表。
例如:十进制就是由0~9十个符号组成的,最小是0,最大是9,逢十进一。
数据存储
假设计算机只能存储4位二进制数,那么能存储的数据就有:
1
2
|
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0 1 2 3 4 5 6 7 8 9 A B C D E F
|
- 在无符号的情况下,每个存储单位的最大值是F。
- 在有符号的情况下,每个存储单位的最大值是7,最大的负数是F。
1
2
3
4
5
|
无符号数:0123456789ABCDEF
有符号数:
正数: 0 1 2 3 4 5 6 7
负数: F E D C B A 9 8
-1 -2 -3 -4 -5 -6 -7 -8
|
就有如下的数据:
1
2
3
|
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
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 -7 -6 -5 -4 -3 -2 -1
|
这就是为什么负数的二进制高位为1,其完全是使用时制定的规则。
原码、反码与补码
以十进制数15举例,其二进制为0000 1111
:
1
2
3
|
原码:0000 1111
反码:0000 1111
补码:0000 1111
|
正数的原码、反码、补码都相同。
以-15为例,假设计算机是以其原码的形式保存的(实际上是以补码的形式保存),那么其二进制为1000 1111
:
1
2
3
|
原码:1000 1111
反码:1111 0000
补码:1111 0001
|
负数的反码是其原码除符号位外全部取反。负数的补码是其在反码的基础上+1。
根据上述的数据存储规则,实际上是以补码的形式保存,因为数据的绝对值是从下向上递增,详见上方数据存储图解。
计算机计算的方法
以2+3举例,2的原码为0010
,3的原码为0011
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
x = 0010
y = 0011
计算:
0010
XOR 0011
---------
0001
R = x xor y = 0001
验算:
V = x & y << 1 == 0010 << 1 == 0100 !== 0
0010
AND 0011
---------
0010
|
因为验算值V != 0
,因此需要继续计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
V != 0 继续计算
重新给x、y赋值:
x = 0001 == R
y = 0100 == V
0001
XOR 0100
---------
0101
R = 0101
验算:
0001
AND 0100
---------
0000
V = 0000 << 1 == 0
结论:
V == 0
R == 0101
当验算值 V == 0 时,R为结果
|
结果为R,也就是0101
,换算成二进制则为5
,
最简单的加密算法
利用XOR可以进行最简单的加密算法实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
D为数据,K为密钥,R为计算结果
加密:
D = 0010
M = 1000
R = D XOR M = 1010
解密:
D = 1010
M = 1000
R = D XOR M = 0010
|
基本单位
1
2
3
4
|
BYTE: 8 bit
WORD: 16 bit = 2 BYTE
DWORD: 32 bit = 2 WORD
QWORD: 64 bit = 4 WORD = 2 DWORD
|