有符号整数的最低有效位 (LSB) 取反
Negation of least significant bit (LSB) of signed integer
This 答案演示了整数 LSB 的取反。当使用负(有符号)整数时,这种方法没有产生预期的结果。让我们看一些代码:
a = 4
print()
print("a: " + str(a))
print("binary version of a: " + bin(a))
a = a | 1
print("binary version of a after negation of LSB: " + bin(a))
print("a after negation of LSB: " + str(a))
print()
b = 5
print("b: " + str(b))
print("binary version of b: " + bin(b))
b = b & ~1
print("binary version of b after negation of LSB: " + bin(b))
print("b after negation of LSB: " + str(b))
print()
c = -4
print("c: " + str(c))
print("binary version of c: " + bin(c))
c = c | 1
print("binary version of c after negation of LSB: " + bin(c))
print("c after negation of LSB: " + str(c))
print()
d = -5
print("d: " + str(d))
print("binary version of d: " + bin(d))
d = d & ~1
print("binary version of d after negation of LSB: " + bin(d))
print("d after negation of LSB: " + str(d))
对 LSB 求反后 c
的期望值为 -5 而不是 -3。同样,LSB 取反后 d
的期望值是 -4 而不是 -6。为什么 c
和 d
的实际值不符合它们的预期值?
我认为这里的问题是 python 将负数存储为它们的二进制补码,但不会以这种方式打印出来。让事情变得非常混乱!这 post here goes into more detail about it,但我们可以通过一个简单的示例了解发生了什么:
-4 二进制为 0b11111100(4 的补码)
1 是正数,所以在二进制中它只是 0b00000001
当你或那两个人在一起时,你会得到:
0b11111101 是-3(二进制补码)的二进制表示
我used this site求补码,值得注意的是python整数是32位而不是8位,所以[=24=前面多了24个1 ]的补数和正数前面的24个额外的0(只要两者都低于abs(255))
This 答案演示了整数 LSB 的取反。当使用负(有符号)整数时,这种方法没有产生预期的结果。让我们看一些代码:
a = 4
print()
print("a: " + str(a))
print("binary version of a: " + bin(a))
a = a | 1
print("binary version of a after negation of LSB: " + bin(a))
print("a after negation of LSB: " + str(a))
print()
b = 5
print("b: " + str(b))
print("binary version of b: " + bin(b))
b = b & ~1
print("binary version of b after negation of LSB: " + bin(b))
print("b after negation of LSB: " + str(b))
print()
c = -4
print("c: " + str(c))
print("binary version of c: " + bin(c))
c = c | 1
print("binary version of c after negation of LSB: " + bin(c))
print("c after negation of LSB: " + str(c))
print()
d = -5
print("d: " + str(d))
print("binary version of d: " + bin(d))
d = d & ~1
print("binary version of d after negation of LSB: " + bin(d))
print("d after negation of LSB: " + str(d))
对 LSB 求反后 c
的期望值为 -5 而不是 -3。同样,LSB 取反后 d
的期望值是 -4 而不是 -6。为什么 c
和 d
的实际值不符合它们的预期值?
我认为这里的问题是 python 将负数存储为它们的二进制补码,但不会以这种方式打印出来。让事情变得非常混乱!这 post here goes into more detail about it,但我们可以通过一个简单的示例了解发生了什么:
-4 二进制为 0b11111100(4 的补码)
1 是正数,所以在二进制中它只是 0b00000001
当你或那两个人在一起时,你会得到:
0b11111101 是-3(二进制补码)的二进制表示
我used this site求补码,值得注意的是python整数是32位而不是8位,所以[=24=前面多了24个1 ]的补数和正数前面的24个额外的0(只要两者都低于abs(255))