我似乎无法在Python中的任何地方找到整数的逻辑否定。
目前我正在使用它:
def not_(x):
assert x in (0, 1)
return abs(1-x)
但我觉得有点愚蠢。这里没有内置的操作员吗?逻辑否定(not
)返回一个布尔值 - 这不是我想要的。是否有不同的运算符,或使not
返回整数的方法,还是我坚持使用这个狡猾的解决方法?
答案 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)
中,这将引发KeyErrordef 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)
我认为你的方法非常好有两个原因:
我假设在整数上不能定义这样的运算符,因为存在以下问题:如果给定值不是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'完成
快乐编码......