0%

位运算

进制转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
我们熟悉的10进制
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19

计算机使用的2进制
0 1
10 11
100 101 110 111
1000 1001 1010 1011 1100 1101 1110 1111

我们可以转换为任何进制,比如3进制
0 1 2
10 11 12 20 21 22
100 101 102 110 111 112 120 121 122 200 201 202 210 211 212 220 221 222

十进制(日常使用)
二进制(计算机使用)
数据宽度(C、C++、Java对数据类型的定义)

  • 无符号数(直接进行进制转换即可)
  • 有符号数

最高位符号位(正数0,负数1)
原码:除符号位外取绝对值
反码:负数取反
补码:负数的反码+1

1
2
3
4
5
数字-5
原码:1000 0101
反码:1111 1010
补码:1111 1011
最后计算机存储是就是补码结果。

位运算

&与(同1为1)
|或 (有1为1)
!非,取反
异或xor (相反为1)
异或运算结构图:
https://www.bilibili.com/video/BV1EW411u7th?p=3
image.png
移动位
左移(<<shl):所有二进制全部左移若干位,高位丢弃,低位补0
右移(>>shr):所有二进制全部右移若干位,低位丢弃,高位补0或1(符号位决定)

计算机实现原理

(重复下面两种运算)
1:异或运算
2:与运算
例如:4+5的运算应该如下:

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
27
28
29
4的二进制是:0000 0100
5的二进制是:0000 0101
-----------------------
1:异或运算
0000 0100
0000 0101
---------
0000 0001

2:与运算
0000 0100
0000 0101
---------
0000 0100
3:有进位就进位
0000 0100
----------
0000 1000
4:异或运算
0000 0001
0000 1000
---------
0000 1001
5:与运算
0000 0001
0000 1000
---------
0000 0000
因为步骤5结果为0,灯全灭,所以结果是步骤4:0000 1001

同理,减法是加法的逆运算,比如4-5就是4+(-5)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
4的二进制是: 0000 0100
-5的二进制是:1111 1011
-----------------------
1:异或运算
0000 0100
1111 1011
---------
1111 1111
2:与运算
0000 0100
1111 1011
---------
0000 0000
因为步骤2结果为0,灯全灭,沙滩椅结果是步骤1:1111 1111

汇编语言

汇编指令(如mov)
寄存器
内存
堆栈
存储数据:CPU>内存>硬盘

1
2
3
4
5
6
7
8
9
32位   16位   8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL 低8位
ESP SP AH
EBP BP CH
ESI SI DH
EDI DI BH 高8位

mov指令
mov 寄存器地址,值
mov 寄存器地址1,寄存器地址2

内存

1B=8bit 1字节等于8位
内存地址编号,值
寻址能力 32位=4GB
FFFF FFFF +1=1 0000 0000
1 0000 0000 *8 = 8 0000 0000
转换为10进制是:
343 5973 8368 位 = 4GB
mov指令
mov 数据宽度 [内存地址]/寄存器,值
内存地址支持位运算