python中的二进制否定

时间:2011-08-03 09:45:43

标签: python bit-manipulation

我似乎无法在Python中的任何地方找到整数的逻辑否定。

目前我正在使用它:

def not_(x):
    assert x in (0, 1)
    return abs(1-x)

但我觉得有点愚蠢。这里没有内置的操作员吗?逻辑否定(not)返回一个布尔值 - 这不是我想要的。是否有不同的运算符,或使not返回整数的方法,还是我坚持使用这个狡猾的解决方法?

8 个答案:

答案 0 :(得分:4)

您可以使用:

int(not x)

将布尔值转换为0或1。

答案 1 :(得分:3)

你的意思是:

int(not(x))

?假设任何非零整数值为真且0为假,则结果总是得到整数0或1。

答案 2 :(得分:2)

如果您正在寻找Bitwise Not,那么~就是您要找的。但是,它以二进制形式工作。

答案 3 :(得分:2)

那么你期望的是当输入为0时得到1,0和输入为1时得到1?然后XOR是你的朋友,你需要用1:

对你的价值进行异或
In [15]: negate = lambda x: x^1

In [16]: negate(0)
Out[16]: 1

In [17]: negate(1)
Out[17]: 0

答案 4 :(得分:1)

如果x不在(0,1)

中,这将引发KeyError
def not_(x):
    return {1:0,0:1}[x]

如果您没有为它添加检查,元组版本也会接受-1,但可能更快

def not_(x):
    return (1,0)[x]

$ python -m timeit "(1,0)[0]"
10000000 loops, best of 3: 0.0629 usec per loop
$ python -m timeit "(1,0)[1]"
10000000 loops, best of 3: 0.0646 usec per loop

$ python -m timeit "1^1"
10000000 loops, best of 3: 0.063 usec per loop
$ python -m timeit "1^0"
10000000 loops, best of 3: 0.0638 usec per loop

$ python -m timeit "int(not(0))"
1000000 loops, best of 3: 0.354 usec per loop
$ python -m timeit "int(not(1))"
1000000 loops, best of 3: 0.354 usec per loop

$ python -m timeit "{1:0,0:1}[0]"
1000000 loops, best of 3: 0.446 usec per loop
$ python -m timeit "{1:0,0:1}[1]"
1000000 loops, best of 3: 0.443 usec per loop

答案 5 :(得分:0)

您可以使用not,然后将结果转换为整数。

int(False)
0
int(True)
1

答案 6 :(得分:0)

我认为你的方法非常好有两个原因:

  1. 快速,清晰,易懂
  2. 进行错误检查
  3. 我假设在整数上不能定义这样的运算符,因为存在以下问题:如果给定值不是0或1,则返回什么?抛出异常?假设正整数表示1?但负整数?

    您的方法定义了具体行为 - 只接受0或1。

答案 7 :(得分:0)

使用python

中的一些基本二进制和字符串操作功能可以轻松完成
  

如果x是一个整数,我们想要一个按位否定,即   叫x_bar(在数字课上学习:))

>>> x_bar = x^int('1'*len(bin(x).split('b')[1]),2)
>>> bin(x_bar) #returns the binary string representation of integer 'x'

bin(int_value)函数返回任何整数的二进制字符串表示形式,例如:'0b11011011'

xor操作以'1'完成

快乐编码......