您能否用一些很好的例子来解释以下几行。
左算术移位 n 相当于乘以 2 n (前提是值不溢出)。
和:
将二进制补码值向右算术移位 n 相当于除以 2 n并舍入到负无穷大。如果二进制数被视为 1 的补码,则相同的右移运算会导致除以 2 n 并向零舍入。
您能否用一些很好的例子来解释以下几行。
左算术移位 n 相当于乘以 2 n (前提是值不溢出)。
和:
将二进制补码值向右算术移位 n 相当于除以 2 n并舍入到负无穷大。如果二进制数被视为 1 的补码,则相同的右移运算会导致除以 2 n 并向零舍入。
我将解释在我们更熟悉的基础上发生的事情:10。
假设你有一个以 10 为底的数字 N=123。现在,你将这个数字“移动”到左边 k=3 个位置,用 0 填充空的数字。所以你得到 X=123000。
请注意 X = N * 10 k。
以 2 为底的情况类似。
Example 1 (base 10) | Example 2 (base 2)
|
N = 123 | N = 110101 (53 in base 10)
k = 3 | k = 2 (in base 10)
N << k = 123000 | N << k = 11010100 (212 in base 10)
|
10^k = 1000 | 2^k = 100 (in base 2; 4 in base 10)
N * 10^k = 123000 | N * 2^k = 11010100 (53 * 4 = 212 in base 10)
|
右移的情况只是该过程的镜像,在基数 10 中也是类似的。例如,如果我在基数 10 中有 123456,并且我“右移”3 个位置,我得到 123。这是 123456 / 1000 (整数除法),其中 1000 = 10 3。
创建自己的示例很容易。
考虑二进制的五个101
。左移一次,你会得到1010
十进制的二进制。再做一次,你会得到10100
二十个等等。