Skip to content

Commit daf07a2

Browse files
committedMar 4, 2019
更新 29
1 parent c57be63 commit daf07a2

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed
 

‎leetCode-29-Divide-Two-Integers.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
所以 4 + (- 2)= 4 + 14 = 2。
4444

45-
我们利用同余的性质,把减法成功转换成了加法,所以我们只需要在计算机里边将 -2 存成 8 就行了。我们这里减去 2 就等价于加上 14。
45+
我们利用同余的性质,把减法成功转换成了加法,所以我们只需要在计算机里边将 -2 存成 14 就行了。我们这里减去 2 就等价于加上 14。
4646

4747
再比如 13 - 7 ,也就是 13 + (-7)
4848

@@ -90,7 +90,11 @@
9090

9191
我们可以看到 1101 + 1110 本来等于 1 1011 ,因为只存储 4 位,所以最高位被丢掉了,其实这就进行了取模的操作,减去了 16 。如果我们看所对应的十进制是怎么操作的, 1101 表示 13,1110 表示 14 ,13 + 14 = 27 ,如果是模 16 操作下,就是 11 ,而 11 就是上边的结果 1011,看表格它代表的数是 - 5,- 3 - 2 = - 5 ,没毛病。
9292

93-
而且我们发现用这种表示方式,所有的正数首位都是 0 ,负数的首位都是 1 ,这一定不是巧合。按我的理解,因为我们要保证正数和他的相反数相加等于 0000 ,如果首位是相同的,那么该位相加一定会是 0 (0 + 0 = 0,1 + 1 = 0,因为高位被丢掉了),假如 0010 的相反数是 0xxx,为了使得后三位相加等于 0 ,一定得产生进位才能实现(不产生进位,我们无法把 0010 中的 1 变成 0),如果产生了进位,那么首位就变成了 1,它的和就变成了 1000 ,不是 0000,产生矛盾。所以正数和负数的首位一定相反,我们可以把它看做符号位。即首位是 0 就是正数,首位是 1 就是负数。
93+
而且我们发现用这种表示方式,所有的正数首位都是 0 ,负数的首位都是 1 ,我们可以这样想。
94+
95+
假设正数和负数的首位相同,假如首位都是 0。
96+
97+
那么比如 a = 0010 这个正数,如果我们去找它的相反数 b,也就是对应的负数。由假设可以知道,它的相反数的最高位也是 0。即 0xxx 的形式。为了使得 a 和它的相反数相加等于 0,我们必须使得相反数 b 的第 3 位是 1,即 0x10,才能使得第 3 位的和是 0。但这样的话,第 3 位产生了进位, b 的第 2 位也得是 1,所以 b 就成了 0110,但这样虽然使得最后 3 位的和变成了 0,但是第 1 位我们假设了它是 0,由于第 2 位产生的进位,这样 a 和 b 相加不是 0 了,产生矛盾。所以假设不成立。所以正数和负数的首位一定不同,如果首位 0 代表正数,那么负数的首位一定是 1。
9498

9599
接下来的问题,给出一个数我们总不能查表去看它的补码吧,我们如何得出补码?
96100

@@ -104,7 +108,7 @@
104108

105109
我们来求 - 2 的补码,用 16 - 2 = 1 0000 - 0010 = ( 1111 + 1 ) - 0010 = ( 1111 - 0010 ) + 1 = 1101 + 1 = 1110 。
106110

107-
为什么转换成 1111 减去一个数,因为用 1111 减去一个数,虽然是减法,但其实只要把这个数按位求反即可。也就是 0010 按位求反变成 1101,再加上 1 就是它的补码了,「按位取反,末位加 1 」这个口诀是不是很熟悉,哈哈,这就是快速求补码的法则。但我们不要忘了它的本质,其实是用模长减去它,但是计算机并不会减法,而是巧妙的转换到了取反再加 1 。
111+
为什么转换成 1111 减去一个数,因为用 1111 减去一个数,虽然是减法,但其实只要把这个数按位求反即可。也就是把 2, 0010 按位求反变成 1101,再加上 1 就是 -2 的补码形式了,「按位取反,末位加 1 」这个口诀是不是很熟悉,哈哈,这就是快速求补码的法则。但我们不要忘了它的本质,其实是用模长减去它,但是计算机并不会减法,而是巧妙的转换到了取反再加 1 。
108112

109113
逆过程呢?如果我们知道了计算机存了个数 1110,那么它代表多少呢?首先首位是 1 ,它一定是一个负数,其次它是怎么得来的呢?往上翻,其实是用 16 - 2 =1110 得到的,我们现在是准备求 2 ,用 16 减去它就可以了,也就是 16 - 1110 = 1 0000 - 1110 = (1111 + 1)- 1110 = (1111 - 1110) + 1 = 0010。巧了,依旧是按位取反,末位加 1。而 0010 就是 2,所以 1110 就代表 - 2。
110114

0 commit comments

Comments
 (0)
Please sign in to comment.