计算机只认识0和1,计算机能做的运算归根结底也就是直接对0和1做运算(通常称为 位运算)

  1. 与运算

两个位都为1时,结果为1 and(&)

  1. 或运算

只要有一个为1 就是1 or(|)

  1. 异或运算

不一样的时候是1 xor(^)

  1. 非运算(单目运算)

0变1 1变0 not(~)

  1. 左移

各二进制位全部左移若干位,高位丢弃,低位补0 shl(>) 在汇编中shr补0,sar补符号位

计算机中的加减乘除

加法

以下计算假设数据宽度均为一个字节 (8Bit)

不考虑进位的情况异或按位相加的结果类似,所以加法可分为两步

  1. 加数异或运算,获得值
  2. 加数运算。判断是否有进位
  3. 如果计算后为0 说明第一步即为结果,如果不为零则需要把运算后的值左移一位,
  4. 继续重复上述过程 直到不再进位时为最终结果
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