对正整数与负整数2进行异或

首先,我在python中尝试了异或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)

其背后的逻辑是什么?

qq273836707 回答:对正整数与负整数2进行异或

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

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

例如:

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

...显示它延伸到无穷大。 source

其余部分紧随其后。

,

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

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对于探索整数位模式非常有用。第二个参数是显示多少位。

,

您假设使用ones complement,尽管谈到了二进制补码。实际上,由于它的缺点(我不知道它是零)(非唯一表示为零,需要特殊处理来跨越符号更改边界),我不知道它实际上已在任何地方使用,至少twos complement的使用频率更高。当然,我所知道的编程语言都无法让您确定使用哪种补语。

本文链接:https://www.f2er.com/2908240.html

大家都在问