在Python中按位操作如何工作?

2024-09-26 04:57:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我今天一直在学习按位运算,我知道不是(~)反转所有位,例如:

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"

你们能解释一下吗?


Tags: orto代码falselenifdefnot
3条回答

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

所以~X=-X-1 =—(X+1)。

假设值为32位,则10为

00000000000000000000000000001010

如果你把所有这些都倒过来

11111111111111111111111111110101

或者-11。因为这是一个2's complement system

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

在two的补码中,-11是10101,这是正确的位反转。

若要对二的补码求反,请反转所有位并添加一个:

01011 eleven
10100 invert
10101 add one gives negative eleven

相关问题 更多 >