将正整数与负整数 2 进行异或运算



首先,我在python中尝试了XOR-ing 1和-1。 因为表示是:

bin(1) == '0b1', 
bin(-1) == '-0b1'

我无法猜测结果会是什么。我期望像"负零"这样的东西 - 符号位负,所有其他位为零。

好吧,我有-2。

接下来,我尝试XOR一些正数n,它的二进制补码负对应整数。

例子:

3 ^ (-1)结果为:-4

2 ^ (-6)结果:-8

对于每个整数 m,n,使得:

2**(k-1) <= n < 2**(k)m = (-1) * ((2**k)-n)

我们得到:

n ^ m == (-1)*(2**k)

这背后的逻辑是什么?

已选择的 m 和 n 值的位模式匹配到第 k 位。 设置所有高于 k-1 的位。 这对应于 -(2**k( 的二进制表示形式。 下面显示了 k = 3 的 n 和 m 作为 8 位模式。

from numpy import binary_repr
def do_k( k ):
for n in range(2**(k-1), 2**k):
bn = binary_repr( n , 8 ) # n for 8 bits
m = (n-2**k)
bm = binary_repr( m , 8 ) # m for 8 bits
print( bn )
print( bm )
print( binary_repr( n ^ m, 8 ) , n, m, n ^ m, 'n' )
do_k(3)
00000100   4
11111100  -4 = 4 - 8
11111000 4 -4 -8 
00000101   5
11111101  -3 = 5 - 8
11111000 5 -3 -8 
00000110   6 
11111110  -2 = 6 - 8
11111000 6 -2 -8 
00000111   7
11111111  -1 = 7 - 8 
11111000 7 -1 -8 

结果模式是由选择模式"引起的"。 np.binary_repr对于探索整数中的位模式非常有用。第二个参数是要显示多少位。

Python 使用 two 的补码来表示负二进制数。

binary(-x) = complement( binary(x) ) + 1

例如:

3 = 0b...00011
-3 = complement(3) + 1 = 0b...11100 + 1  = 0b...11101

这。。。表明它延伸到无穷大。 源

其余的如下。

你假设使用一个补码,尽管谈论二补码。实际上,我不知道它实际上在任何地方使用,因为它的缺点(零的非唯一表示,跨越符号更改边界需要特殊处理(,至少二进制补码更频繁地使用。当然,据我所知,没有一种编程语言可以让你确定使用哪种补充。

最新更新