按位运算如何在Python中运行?

J_m*_*ie6 7 python bit-manipulation

我今天一直在学习Bitwise操作,我学会了Not(〜)反转所有位,例如:

01010
to
10101
Run Code Online (Sandbox Code Playgroud)

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

01010
to
11011
Run Code Online (Sandbox Code Playgroud)

只有两个位被反转.谁能解释为什么它不是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"
Run Code Online (Sandbox Code Playgroud)

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

Mr *_*ter 7

假设值为32位,则为10

00000000000000000000000000001010
Run Code Online (Sandbox Code Playgroud)

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

11111111111111111111111111110101
Run Code Online (Sandbox Code Playgroud)

或-11.因为它是2的补充系统!

  • 从概念上讲,2s补码表示中的负数在左侧具有任意数量的"1".您需要知道有多少用于转换数字.Python定义`~`,以便用于表示结果的位数等于表示输入所需的最小位数.但是,它的净效果通常是`~x` ==`-x - 1`. (2认同)

pax*_*blo 6

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

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

要取消二进制补码,可以反转所有位并加一:

01011 eleven
10100 invert
10101 add one gives negative eleven
Run Code Online (Sandbox Code Playgroud)

  • 至少,在5位系统中. (7认同)
  • 如果你有更多的位,你只需签名extend(左边有一位前缀).我使用5位,因为问题显示5位.但是,无论宽度如何,它都是完全相同的过程. (2认同)
  • @ J_mie6在二进制补码系统中,最高有效位*表示数字的符号.如果设置了位,则该数字为负数.如果没有,那么它是零或正面.与已签名的位系统相比,2的补码的好处很多,您可以自己查找.一个这样的优点是数字0仅具有单个表示(与有符号位系统中的0b000 = 0和-0b000 = -0 = 0相反). (2认同)