首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完全为负的正整数XORing two

完全为负的正整数XORing two
EN

Stack Overflow用户
提问于 2019-12-17 16:02:30
回答 3查看 273关注 0票数 0

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

代码语言:javascript
复制
bin(1) == '0b1', 
bin(-1) == '-0b1'

我猜不出结果会是什么。我期望的结果是‘负零’--符号位为负,其他位均为零。

好吧,我得到了-2。

接下来,我尝试用it's XOR - n负整数来求一些正数的补码。

示例:

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

2 ^ (-6)结果为:-8

对于满足以下条件的每个整数m,n:

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

我们得到:

代码语言:javascript
复制
n ^ m == (-1)*(2**k)

这背后的逻辑是什么?

EN

回答 3

Stack Overflow用户

发布于 2019-12-17 16:28:22

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

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

例如:

代码语言:javascript
复制
3 = 0b...00011
-3 = complement(3) + 1 = 0b...11100 + 1  = 0b...11101

那个..。表明它延伸到无穷大。source

剩下的部分如下所示。

票数 0
EN

Stack Overflow用户

发布于 2019-12-17 22:31:08

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

代码语言:javascript
复制
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对于探索整数中的位模式非常有用。第二个参数是要显示的位数。

票数 0
EN

Stack Overflow用户

发布于 2019-12-17 16:22:10

尽管谈论的是二进制补码,但您假定使用的是ones complement。实际上,我没有意识到它实际上被使用在任何地方,因为它的缺点(零的非唯一表示,跨越符号变化边界所需的特殊处理),至少twos complement的使用要频繁得多。当然,我所知道的任何编程语言都不会让您决定使用哪种类型的补充。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59369870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档