为什么这个二进制补码快捷方式有效?
Why does this two's complement shortcut work?
形成二进制数的补码的一种快捷方法是从右边复制位,直到复制完一位,然后对剩余的位求补(取反)。
SO and also on Wikipedia 上有解释。
没有解释的是为什么这个快捷方式有效,也就是说,为什么它产生与反转所有位并加一相同的结果。所以,我的问题是,为什么这样做有效?
将数字写为 x10k(一些位串后跟 1,然后是 k 个零)。
假设你对它进行补码然后加一,你首先得到 y01k(其中 y 是 x 的补码),然后递增通过尾部的和将零翻转回 y10k.
这与仅对 x 进行补码而保留尾部是一回事。
之所以可行,是因为向二进制数加 1 是通过从右侧将所有 1 翻转为 0 直到达到 0,将其翻转为 1 并停止(本质上是携带 1 加 1 的溢出)来实现的。
所以一种方法只翻转第一个左边的位,而另一种方法翻转 所有 位,然后翻转第一个 1(现在为 0)和它的右边。
例如:
01000100
10111100 // copy bits until a 1 is reached, then flip the rest
对
01000100
10111011 // invert all bits:
+ 1 // add one
10111100
所以我找到了一条捷径;
Note:This 如果您被允许使用可以进行二进制到十进制转换的计算器,这个技巧就可以奏效。
如果有像这样的 MCQ 问题;
Q) 5 的 8 位 2 的补码表示是 ....
,用公式=2^(位数)-个数
在这种情况下,它的 8 位和数字 5
所以; (2^8) - 5
2^8=256
256-5=251
使用计算器将251转换成二进制
然后 = 11111011 二进制。
适用于任何位数。
形成二进制数的补码的一种快捷方法是从右边复制位,直到复制完一位,然后对剩余的位求补(取反)。
SO
没有解释的是为什么这个快捷方式有效,也就是说,为什么它产生与反转所有位并加一相同的结果。所以,我的问题是,为什么这样做有效?
将数字写为 x10k(一些位串后跟 1,然后是 k 个零)。
假设你对它进行补码然后加一,你首先得到 y01k(其中 y 是 x 的补码),然后递增通过尾部的和将零翻转回 y10k.
这与仅对 x 进行补码而保留尾部是一回事。
之所以可行,是因为向二进制数加 1 是通过从右侧将所有 1 翻转为 0 直到达到 0,将其翻转为 1 并停止(本质上是携带 1 加 1 的溢出)来实现的。
所以一种方法只翻转第一个左边的位,而另一种方法翻转 所有 位,然后翻转第一个 1(现在为 0)和它的右边。
例如:
01000100
10111100 // copy bits until a 1 is reached, then flip the rest
对
01000100
10111011 // invert all bits:
+ 1 // add one
10111100
所以我找到了一条捷径; Note:This 如果您被允许使用可以进行二进制到十进制转换的计算器,这个技巧就可以奏效。 如果有像这样的 MCQ 问题; Q) 5 的 8 位 2 的补码表示是 .... ,用公式=2^(位数)-个数 在这种情况下,它的 8 位和数字 5 所以; (2^8) - 5 2^8=256 256-5=251 使用计算器将251转换成二进制 然后 = 11111011 二进制。 适用于任何位数。