7

我今天一直在学习按位运算,我了解到 Not (~) 反转所有位,例如:

01010
to
10101

这意味着〜10应该是-5,但我看到它是-11(根据python命令行),它是

01010
to
11011

只有两个位被反转。谁能解释为什么不是10101?

编辑:看了我的计算器后,我对它的理解更好了,但是我自己确定二进制和整数的代码仍然很困惑。输入(以字节模式)11110101 给我 -11 但在我的代码中输入的相同给我 -117:

def binaryToInt(biNum, bUnsigned = False):
    iNum = 0
    bSign = int(biNum[0]) if not (bUnsigned or biNum[-1] == "u") else 0
    biNum = biNum[(1 if not (bUnsigned or biNum[-1] == "u") else 0):(len(biNum) if biNum[-1] != "u" else -1)]
    for i in xrange(len(biNum)):
        iNum += int(biNum[i]) * 2**(len(biNum) - 1 - i)
    return (iNum if not bSign else -iNum)

def intToBinary(iNum, bUnsigned = False):
    bSign = "1" if iNum < 0 else "0"
    iLoopNum = int((iNum ** 2) ** 0.5) #make positive!
    biNum = ""
    while iLoopNum:
        biNum += str(iLoopNum%2)
        iLoopNum /= 2
    return bSign + biNum[::-1] if not bUnsigned else biNum[::-1] + "u"

你们中的一个可以解释一下吗?

4

3 回答 3

7

假设值是 32 位,则 10 是

00000000000000000000000000001010

如果你反转所有这些位,你会得到

11111111111111111111111111110101

或-11。因为它是一个2的补码系统

于 2012-08-04T16:29:57.753 回答
6

11011不是-11。您对负数的编码方案有误解。

在二进制补码中,-11 是10101正确的位反转。

要对二进制补码取反,请反转所有位并加一:

01011 eleven
10100 invert
10101 add one gives negative eleven
于 2012-08-04T16:21:56.787 回答
0

10101 是 -11,因为在二进制中,-X = ~X + 1。

所以〜X = -X - 1 = -(X + 1)。

于 2019-10-04T06:28:18.020 回答