1. 原码、反码、补码
最高位是符号位,0表示正数,1表示负数
例1 -1, 8位
原码 1000 0001
反码 1111 1110
补码 1111 1111
例2 -7, 8位
原码 1000 0111
反码 1111 1000
补码 1111 1001
2. 位运算
- 与(and &)
0011 0101
& 0001 0111
---------------
0001 0101
- 或(or |)
0011 0101
| 0001 0111
---------------
0011 0111
- 异或(xor ^)
0011 0101
^ 0001 0111
---------------
0010 0010
- 非(not ~)
~ 0001 0111
---------------
1110 1000
- 左移(shl <<)
<< 1 0001 0111
-------------------
0010 1110
- 右移(shr >>)
>> 1 0001 0111
-------------------
0000 1011
3. 加减乘除
加法
计算: 0011 0101 + 0001 0111
- 异或
0011 0101
^ 0001 0111
---------------
0010 0010
- 与
0011 0101
& 0001 0111
---------------
0001 0101
- 左移
0001 0101 << 1 = 0010 1010
- 异或
0010 0010
^ 0010 1010
---------------
0000 1000
- 与 + 左移
0010 0010
& 0010 1010
---------------
0010 0010
<< 1
---------------
0100 0100
- 异或
0000 1000
^ 0100 0100
---------------
0100 1100
- 与(无进位,结束)
0000 1000
^ 0100 0100
---------------
0000 0000
- 检查
0011 0101 = 53
+ 0001 0111 = 23
---------------------
0100 1100 = 76
// c++负数不支持左移
class Solution {
public:
int add(int a, int b) {
// 异或 与 判断进位 左移
unsigned XOR = a ^ b, AND = a & b;
while (AND != 0) {
a = XOR;
b = AND << 1;
XOR = a ^ b;
AND = a & b;
}
return XOR;
}
};
减法
计算: 0011 0101 - 0001 0111
- 写出补码
0001 0111
(原码)1001 0111
(反码)1110 1000
(补码)1110 1001
- 异或
0011 0101
^ 1110 1001
---------------
1101 1100
- 与 + 左移
0011 0101
& 1110 1001
---------------
0010 0001
<< 1
---------------
0100 0010
- 异或
1101 1100
^ 0100 0010
---------------
1001 1110
- 与 + 左移
1101 1100
& 0100 0010
---------------
0100 0000
<< 1
---------------
1000 0000
- 异或
1001 1110
^ 1000 0000
---------------
0001 1110
- 与 + 左移(无进位,结束)
1001 1110
& 1000 0000
---------------
1000 0000
<< 1
---------------
0000 0000
- 检查
0011 0101 = 53
- 0001 0111 = 23
---------------------
0001 1110 = 30
4. 32位4GB内存的由来
存储数据: 寄存器 > 内存 > 硬盘
1 bit = 0, 1
1 Byte = 8 bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
4 GB = 4 * 1024 MB
= 4 * 1024 * 1024 KB
= 4 * 1024 * 1024 * 1024 Byte
= 4 * 1024 * 1024 * 1024 * 8 bit
= 2 ^ 32 * 8 bit
一个内存地址是8bit,共有232个内存地址。