python3:如何得到二进制数的逻辑补码(否定),例如。 '010'=> '101'?

时间:2011-08-22 15:14:47

标签: python-3.x bit-manipulation complement negation

也许我错过了一些东西,但我找不到一种直接的方法来完成这个简单的任务。当我通过“〜”运算符取消二进制数时,由于二者的补码,它返回一个负数:

>>> bin(~0b100010) # this won't return '0b011101'
'-0b100011'

如果我只想将0切换为1,反之亦然,如经典逻辑补码那么?

5 个答案:

答案 0 :(得分:3)

>>> bin(0b111111 ^ 0b100010)
'0b11101'
>>> 

答案 1 :(得分:3)

你的答案就是一个功能:

def complement(n):
    size = len(format(n, 'b'))
    comp = n ^ ((1 << size) - 1)
    return '0b{0:0{1}b}'.format(comp, size)

>>> complement(0b100010)
'0b011101'

我保留了原始的位长。 int构造函数不关心前导零:

>>> complement(0b1111111100000000)
'0b0000000011111111'

>> int(complement(0b1111111100000000), 2)
255

答案 2 :(得分:1)

超讨厌:

>>> '0b' + ''.join('10'[int(x)] for x in format(0b100010,'b')).lstrip('0')
'0b11101'

答案 3 :(得分:0)

这是另外几个函数,它们返回我出现的数字的补码。

单行:

def complement(c):
    return c ^ int('1'*len(format(c, 'b')), 2)

更加数学化的方式:

def complement(c):
    n=0
    for b in format(c, 'b'): n=n<<1|int(b)^1
    return n

此外,使用functools(如巴洛克式)将最后一个单线化:

def complement(c):
    return functools.reduce( lambda x,y: x<<1|y, [ int(b)^1 for b in format(c, 'b') ])

最后,第一个使用math.log来计算二进制数字的无用的书呆子变体:

def complement(c):
    c ^ int('1' * math.floor(math.log((c|1)<<1, 2)), 2)

答案 4 :(得分:0)

另一个函数更像是用于补充整数的“Hack”。您可以使用相同的逻辑来补充二进制。不知道为什么我没有遇到可以做同样的python外部库。 Python的下一个版本应该在内置函数

中处理这个问题
  

def complement(x):

b = bin(x)[2:]
c= []
for num in b:
    if num == '1': c.append('0')
    elif num == '0': c.append('1')

cat = ''.join(c)
res = int(cat, 2)
return print(res)