应用位移运算符

3

这个问题看起来可能是重复的,但事实上并不是。我想知道如何将一个负数(十进制)转换为32位数字(二进制)。例如,在基数-10中,-9相当于基数-2中的11111111111111111111111111110111 。请详细解释一下操作过程。谢谢。


1
你提到了一个叫做二进制补码(32位)的东西。这是一种用于表示负十进制数的二进制方法。有很好的解释,比如二进制补码 - gfkri
1个回答

1
假设您的问题中有32位值,为了使我的文本简单易懂,这同样适用于所有位数的数字。
在二进制补码表示法中,两个32位值的加法与按通常方式表示非负数时将它们相加完全相同。只是一些比特模式表示负数,实际上是那些带有前导1的数字,我们通常期望它们来自所有32位数字集合的最大一半。
既然如此,一个全部为1的比特模式,通常应该是最大的32位数字,
    11111111111111111111111111111111

实际上代表-1.原因是,如果您将1添加到此处,进位将全部进行,将每个1替换为0,并且最后一次进位将从末尾掉落,类似于三位数计数器中的999,如果增加则返回000。结果是

    00000000000000000000000000000000

通常情况下,它代表零。这就是在二进制补码表示法中如何使 -1 + 1 = 0

现在,如果您拿一个32位数字 n,例如:

    00010111000010101100100011110010

对其进行按位补码运算即可得到~n,也就是将每个1替换为0,每个0替换为1。

    11101000111101010011011100001101

然后将它们相加,得到n + ~n

    00010111000010101100100011110010
    11101000111101010011011100001101 +
    --------------------------------
    11111111111111111111111111111111

没有进位发生,你得到了一个全是1的比特模式,即 -1 = n + ~n,因此 -n = ~n + 1

这就是二进制补码表示法的关键事实:-n = ~n + 1

现在你可以非常简单地解决问题。你知道如何将正数转换,这使你能够对其取反。

那么 -9 是多少?

首先像往常一样将9转换为二进制:1001,前面有很多前导零。 然后对其取反,再加1,就得到了-9。以下是事件的顺序。

 n : 00000000000000000000000000001001
        //complement
~n : 11111111111111111111111111110110
        //add 1
-n : 11111111111111111111111111110111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接