第8节:要点回顾:
大家应该知道计算机只认识0和1,如果说运算的话,它会的运算只有位运算,也就是我们所说的与、或、非、异或、左移、右移运算。除了这些其他它都不会。连最基本的加、减、乘、除都无法直接计算,而是要通过位运算来间接实现。那么这节课我们通过位运算来给大家讲一下计算机本身如何通过位运算来实现四则运算。
这些问题在很多大的公司当做面试题。
我们先看一下4+5=?的运算过程,计算机是如何通过4+5求值的,我们先看4+5转成二进制是多少。我们假设这个数据的宽度是一个字节。
0000 0100
加 0000 0101
——————————
0000 1001
0000 0100
xor(^) 0000 0101
——————————
0000 0001
大家想一下,如果计算机能怎么做加法运算吗?如果怎么简单的话它的值就是0000 1001(十进制就是9),但是很遗憾,计算机只会做位运算,这种按位加它是做不到的,我们仔细观察一下,这个按位加与一个位运算特别的接近,这是哪个运算呢?其实就是异或运算,求出的结果是0000 1001(就是不一样的值为真,一样的情况时候为假)。所以我们发现一个问题,如果不考虑进位的情况下异或的结果和按位加的结果是一样的(大家这块需要思考一下,不好理解),我们接的往下看,在举个例子:0和1相加如下:
0000 0000
0000 0001
——————————
0000 0001
实际上它们可以用异或来实现加法,我们在来看加法如何实现的。
1)异或:类似按位加
0000 0100
xor(^) 0000 0101
_______________________
0000 0001
2)判断4+5有没有进位的过程,当0和1相加的时候,显示是没有进位的情况只有当2个值都为1的时候需要进位。
0000 0100
and(&) 0000 0101
_________________________
0000 0100
如果与它的值为0,那说明4+5的值是没有进位的,既然没有进位。那上一次加的结果就是最终的结果。比如说1加0的时候结果是0000 0001,再用0000 0001和0000 0000 判断是否有进位的时候结果是:0000 0000,所以1加0的结果一定是0000 0001,但是我在来看4+5的进位的结果并不是0,说明一个问题4+5的时候有进位的,那在什么地方有进位呢?看异或的结果,那个位置为1,就是那个位置是进位了。那么进位这个数怎么办呢?我们要把进位这个数拿过来跟上面的异或结果在相加。
3)继续异或
0000 0001
xor(^) 0000 1000
______________________
0000 1001
如果出现进位的时候,它会往前进一个位,得出的值是0000 1000(注意:第2步的结果0000 0100是要向左移一位结果)
4) 在此判断是否是进位,将第1步的值与第2步的左移一位的值进行异或
0000 0001
and(&) 0000 1000
_______________________
0000 0000
在次判断是否有进位"与"(and)后的结果是0,说明这两个数在“与”的时候没有进位。一开始的时候说的两个数没有进位那么异或的0000 1000 结果就是最终结果(注意:异或的结果就是按位加的结果)
我们在来看一下4-5=?的运算过程
1) 4-5=4+(-5) -5=FB
2) 异或
0000 0100
xor(^) 1111 1011
_____________________
1111 1111
3) 判断是否有进位
0000 0100
and(&) 1111 1011
————————
0000 0000
判断的结果是0,说明没有进位最终的结果就是1111 1111,转成十六进制就是FF,在转成有符号的十进制数就是-1。
大家应该知道计算机只认识0和1,如果说运算的话,它会的运算只有位运算,也就是我们所说的与、或、非、异或、左移、右移运算。除了这些其他它都不会。连最基本的加、减、乘、除都无法直接计算,而是要通过位运算来间接实现。那么这节课我们通过位运算来给大家讲一下计算机本身如何通过位运算来实现四则运算。
这些问题在很多大的公司当做面试题。
我们先看一下4+5=?的运算过程,计算机是如何通过4+5求值的,我们先看4+5转成二进制是多少。我们假设这个数据的宽度是一个字节。
0000 0100
加 0000 0101
——————————
0000 1001
0000 0100
xor(^) 0000 0101
——————————
0000 0001
大家想一下,如果计算机能怎么做加法运算吗?如果怎么简单的话它的值就是0000 1001(十进制就是9),但是很遗憾,计算机只会做位运算,这种按位加它是做不到的,我们仔细观察一下,这个按位加与一个位运算特别的接近,这是哪个运算呢?其实就是异或运算,求出的结果是0000 1001(就是不一样的值为真,一样的情况时候为假)。所以我们发现一个问题,如果不考虑进位的情况下异或的结果和按位加的结果是一样的(大家这块需要思考一下,不好理解),我们接的往下看,在举个例子:0和1相加如下:
0000 0000
0000 0001
——————————
0000 0001
实际上它们可以用异或来实现加法,我们在来看加法如何实现的。
1)异或:类似按位加
0000 0100
xor(^) 0000 0101
_______________________
0000 0001
2)判断4+5有没有进位的过程,当0和1相加的时候,显示是没有进位的情况只有当2个值都为1的时候需要进位。
0000 0100
and(&) 0000 0101
_________________________
0000 0100
如果与它的值为0,那说明4+5的值是没有进位的,既然没有进位。那上一次加的结果就是最终的结果。比如说1加0的时候结果是0000 0001,再用0000 0001和0000 0000 判断是否有进位的时候结果是:0000 0000,所以1加0的结果一定是0000 0001,但是我在来看4+5的进位的结果并不是0,说明一个问题4+5的时候有进位的,那在什么地方有进位呢?看异或的结果,那个位置为1,就是那个位置是进位了。那么进位这个数怎么办呢?我们要把进位这个数拿过来跟上面的异或结果在相加。
3)继续异或
0000 0001
xor(^) 0000 1000
______________________
0000 1001
如果出现进位的时候,它会往前进一个位,得出的值是0000 1000(注意:第2步的结果0000 0100是要向左移一位结果)
4) 在此判断是否是进位,将第1步的值与第2步的左移一位的值进行异或
0000 0001
and(&) 0000 1000
_______________________
0000 0000
在次判断是否有进位"与"(and)后的结果是0,说明这两个数在“与”的时候没有进位。一开始的时候说的两个数没有进位那么异或的0000 1000 结果就是最终结果(注意:异或的结果就是按位加的结果)
我们在来看一下4-5=?的运算过程
1) 4-5=4+(-5) -5=FB
2) 异或
0000 0100
xor(^) 1111 1011
_____________________
1111 1111
3) 判断是否有进位
0000 0100
and(&) 1111 1011
————————
0000 0000
判断的结果是0,说明没有进位最终的结果就是1111 1111,转成十六进制就是FF,在转成有符号的十进制数就是-1。