计算机只认识0和1,计算机能做的运算归根结底也就是直接对0和1做运算(通常称为
位运算
)
- 与运算
两个位都为1时,结果为1
and(&)
- 或运算
只要有一个为1 就是1
or(|)
- 异或运算
不一样的时候是1
xor(^)
- 非运算(单目运算)
0变1 1变0
not(~)
- 左移
各二进制位全部左移若干位,高位丢弃,低位补0
shl(>)
在汇编中shr
补0,sar
补符号位
计算机中的加减乘除
加法
以下计算假设数据宽度均为一个字节 (8Bit)
不考虑进位的情况异或
和按位相加
的结果类似,所以加法可分为两步
- 加数
异或
运算,获得值 - 加数
与
运算。判断是否有进位 - 如果
与
计算后为0 说明第一步即为结果,如果不为零则需要把与
运算后的值左移一位, - 继续重复上述过程 直到不再进位时为最终结果
4+5的运算过程
4 => 0000 0100
5 => 0000 0101
1) 异或
0000 0100
0000 0101
xor ---------
0000 0001
2) 判断是否有进位 两个加数判断
0000 0100
0000 0101
and ---------
0000 0100
与运算后并不为0 说明 有进位 此位不为0 因为发生了进位所以要左移一位继续异或
3) 有进位 继续异或 判断需要进位的左移一位,进位操作后继续异或
0000 0001
0000 1000
xor ---------
0000 1001
4) 判断上一步操作是否进位
0000 0001
0000 1000
and ---------
0000 0000
结果为零 说明没有任何进位 则上一步结果 0000 1001 为4+5的值
0000 1001 十进制为9 证明计算正确
减法
计算机做减法,就是做加法
4-5 = ?
4-5 = 4+ (-5)
4 => 0000 0100
-5 => 1111 1011
1) 异或
0000 0100
1111 1011
xor ---------
1111 1111
2) 判断是否有进位 两个加数判断
0000 0100
1111 1011
and ---------
0000 0000
结果为零 说明没有任何进位 则上一步结果 1111 1111 为4+(-5)的值
1111 1111 十进制为-1 证明计算正确
乘法
X * Y 本质为 Y 个 X 相加
除法
X / Y 本质为减法 Y 一共能减去多少次Y