布尔运算符与按位运算符

我很困惑到什么时候应该使用布尔运算符和位运算符

and vs &, or vs | 

有人能告诉我,我什么时候使用每个,什么时候使用一个在另一个影响我的结果?

这里有一些指导方针:

  • 布尔运算符通常用于布尔值,但按位运算符通常用于数值。
  • 布尔运算符是短路的,但按位运算符不是短路的。

短路行为在这样的expression中是有用的:

 if x is not None and x.foo == 42: # ... 

这对于按位&运算符来说是不正确的,因为双方总会被评估,给AttributeError: 'NoneType' object has no attribute 'foo' 。 当你使用布尔值and运算符时,第一个expression式为False时,第二个expression式不计算。 类似地or如果第一个参数为True,则不计算第二个参数。

在理论上, andor直接来自布尔逻辑(因此在两个布尔运算上产生一个布尔值),而&| 应用布尔值和/或整数的各个位。 这里有很多关于后者如何工作的问题。

以下是可能影响结果的实际差异:

  1. and or短路,即True or sys.exit(1)不会退出,因为对于第一个操作数的某个值( True or ...False and ... ),第二个操作数不会更改结果=不需要评估。 但是|&不要短路 – True | sys.exit(1) True | sys.exit(1)抛出你的REPL。
  2. (只适用于一些带有运算符重载的语言,包括Python 🙂 &| 是常规运算符,可以重载 – and / or伪造成语言(尽pipe至less在Python中,强制为布尔值的特殊方法可能有副作用)。
  3. (只适用于几种语言[见KennyTM的评论] 🙂 andor返回(总是?永远不会真正理解这一点,也不需要它)操作数的值而不是TrueFalse 。 这不会改变条件1 or True的布尔expression式的含义, 1 or True1 ,但是1也是如此。 但它曾经被用来模拟一个条件运算符( cond ? true_val : false_val在C语法中, true_val if cond else false_val在Python几年以后)。 对于&| ,结果types取决于操作数如何重载相应的特殊方法( True & FalseFalse99 & 73 ,因为它是联合/交集…)。

但是,即使例如a_boolean & another_boolean同样工作,正确的解决scheme是使用and – 只是因为andor关联布尔expression式和条件而&| 代表有点扭曲。

这里有一个更进一步的差异,我刚刚困惑了一段时间:因为& (和其他位运算符)比(和其他布尔运算符)具有更高的优先级,以下expression式评估为不同的值:

 0 < 1 & 0 < 2 

 0 < 1 and 0 < 2 

即,第一个产生False因为它等于0 < (1 & 0) < 2 ,因此0 < 0 < 2 ,因此0 < 0 and 0 < 2

提示的名字是:

  • 布尔运算符用于执行逻辑运算 (编程和forms逻辑中常见的真值testing)
  • 按位运算符用于“bit-twiddling” (字节和数字数据types中的低位操作)

虽然有时候可能的话(通常出于效率的原因)需要使用按位运算符来执行逻辑运算,但通常应避免出于此目的,以防止出现细微的错误和不必要的副作用。

如果你需要操纵位,那么按位操作符就是专门构build的。 有趣的书: Hackers Delight包含了一些很酷且真正有用的例子,它们可以通过点击来实现。

如果你试图在numpy进行元素布尔操作,答案会有所不同。 你可以使用&| 对于元素布尔操作,但andor将返回值错误。

为了安全起见,您可以使用numpy逻辑function 。

 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) 

布尔操作是逻辑操作。

按位操作是对二进制位的操作。

按位操作:

 >>> k = 1 >>> z = 3 >>> k & z 1 >>> k | z 3 

操作:

 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)设置和清除位

布尔运算:

 >>> k = True >>> z = False >>> k & z # and False >>> k | z # or True >>> 

布尔'和'与位比'&':

伪代码/ Python帮助我理解这些差异:

 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 (eg 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)