Boolean operators vs Bitwise operators
我对什么时候应该使用Boolean和Bitwise运算符感到困惑
1 | and vs &, or vs | |
有人能告诉我什么时候使用每一个,什么时候使用一个对另一个会影响我的结果吗?
以下是一些指导原则:
- 布尔运算符通常用于布尔值,但位运算符通常用于整数值。
- 布尔运算符短路,但位运算符不短路。
短路行为在以下表达式中很有用:
1 2 | if x is not None and x.foo == 42: # ... |
这对于按位的
理论上,
以下是可能影响结果的实际差异:
但是,即使在
还有一个更大的区别,这让我困惑了一段时间:由于
1 | 0 < 1 & 0 < 2 |
对战
1 | 0 < 1 and 0 < 2 |
。
也就是说,第一个生成的
如果您试图在
为了安全起见,您可以使用numpy逻辑函数。
1 2 3 4 5 6 7 8 | np.array([True, False, True]) | np.array([True, False, False]) # array([ True, False, True], dtype=bool) np.array([True, False, True]) or np.array([True, False, False]) # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() np.logical_or(np.array([True, False, True]), np.array([True, False, False])) # array([ True, False, True], dtype=bool) |
提示的名称为:
- 布尔运算符用于执行逻辑操作(编程和形式逻辑中常见的真值测试)
- 位运算符用于"位旋转"(字节和数字数据类型中位的低级操作)
虽然使用位运算符执行逻辑操作是可能的,而且有时确实是可取的(通常是出于效率原因),但为了防止细微的错误和不必要的副作用,通常应避免使用位运算符。
如果需要操作位,则位运算符是专门构建的。这本有趣的书:黑客之乐包含了一些很酷和真正有用的例子,这些例子说明了通过小旋转可以实现什么。
布尔运算是逻辑运算。
位操作是对二进制位的操作。
按位运算:
1 2 3 4 5 6 | >>> k = 1 >>> z = 3 >>> k & z 1 >>> k | z 3 |
号
操作:
1 2 3 4 | And & 1 if both bits are 1, 0 otherwise Or | 1 if either bit is 1 Xor ^ 1 if the bits are different, 0 if they're the same Not ~ Flip each bit |
位运算的一些用法:
1)设置和清除位
布尔运算:
1 2 3 4 5 6 7 | >>> k = True >>> z = False >>> k & z # and False >>> k | z # or True >>> |
。
一般规则是对现有操作数使用适当的运算符。对布尔操作数使用布尔(逻辑)运算符,对(更宽)整数操作数使用位运算符(注意:false等于0,true等于1)。唯一"棘手"的情况是将布尔运算符应用于非布尔操作数。让我们举一个简单的例子,如[so]:python-"and"和"and"[duplicate]:
对于按位和(&;),事情非常简单:
1
2
3
4 5 = 0b101
7 = 0b111
-----------------
5 & 7 = 0b101 = 5
号
对于逻辑与,这里是的内容:布尔操作状态(重点是我的):
(Note that neither and nor or restrict the value and type they return to False and True, but rather return the last evaluated argument.
号
例子:
1
2
3
4 >>> 5 and 7
7
>>> 7 and 5
5
号
当然,这同样适用于与或。
布尔值'和'对位'&;':
伪代码/python帮助我理解了这两者之间的区别:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | def boolAnd(A, B): # boolean 'and' returns either A or B if A == False: return A else: return B def bitwiseAnd(A , B): # binary representation (e.g. 9 is '1001', 1 is '0001', etc.) binA = binary(A) binB = binary(B) # perform boolean 'and' on each pair of binaries in (A, B) # then return the result: # equivalent to: return ''.join([x*y for (x,y) in zip(binA, binB)]) # assuming binA and binB are the same length result = [] for i in range(len(binA)): compar = boolAnd(binA[i], binB[i]) result.append(compar) # we want to return a string of 1s and 0s, not a list return ''.join(result) |
号