0x00

博主在学逆向,有空的话把一些知识点记下来。

今天看到一个问题: 2 + 3 = ?

人类算的是十进制的2加上十进制的3等于十进制的5,而计算机里没有23456789,它只有高电平和低电平。

0x01

十进制的2在计算机里的表现形式是: 0010

十进制的3在计算机里的表现形式是: 0011

计算机在计算时它会对这两个数进行按位异或运算:

1
2
3
4
        0010
xor 0011
------------
0001

0010和0011按位异或的结果就是0001。

异或完了之后,计算机会再进行按位与运算,并且将运算的结果左移一位,然后进行判断:

1
2
3
4
        0010
and 0011
------------
0010 << 1 = 0100

本次按位与运算的运算结果是0010,将0010左移一位的结果是0100,假如左移后结果等于0000,那么说明上一次按位异或运算的结果0001就是最终结果。如果不等于0000,那么说明上一次按位异或的结果不是最终结果,就会再进行按位异或运算。

本次按位异或运算中,就是上一次按位异或运算的结果0001和上一次按位与运算并将结果左移一位后的结果0100来进行按位异或运算

1
2
3
4
        0001
xor 0100
------------
0101

本次按位异或运算的结果就是0101。

异或运算结束后,再进行一次按位与运算。本次的按位与运算就是也是上一次按位异或运算的结果0001和上一次按位与运算的结果0100来进行按位与运算了,并且将运算结果左移一位:

1
2
3
4
        0001
and 0101
------------
0000 << 1 = 0000

本次按位与运算并将结果左移一位后等于0000了,那么说明上一次异或运算的结果0101就是0010 + 0011的最终结果。

二进制0101的十进制嘞,就是5,所以2 + 3的结果计算机就是这么算出来的。

1
2 + 3 = 5 <==> 0010 + 0011 = 0101