布尔运算符与按位运算符
我对何时应该使用布尔运算符与按位运算符感到困惑
and vs &, or vs |
有人能启发我何时使用每种药物,何时使用一种药物会影响我的结果?
8个解决方案
56 votes
以下是一些准则:
布尔运算符通常用于布尔值,而按位运算符通常用于整数值。
布尔运算符是短路,但按位运算符不是短路。
短路行为在这样的表达式中很有用:
if x is not None and x.foo == 42:
# ...
这将无法按位&运算符正常工作,因为将始终对双方进行求值,得出AttributeError: 'NoneType' object has no attribute 'foo'。当使用布尔值and489运算符时,当第一个表达式为False时,不会评估第二个表达式。 同样,如果第一个参数为True,则or不评估第二个参数。
Mark Byers answered -10-09T06:20:20Z
18 votes
理论上,2561282536966961999872和and直接来自布尔逻辑(因此对两个布尔进行运算以产生布尔),而and和or将布尔值和/或应用于整数的各个位。 这里有很多关于后者如何精确工作的问题。
以下是可能会影响您结果的实际差异:
a_boolean & another_boolean和and短路,即2561282536966961999874不会退出,因为对于第一个操作数的某个值(or,25612825369619991999876),第二个操作数不会更改结果=不需要求值。 但是25612825369619991999和1不会短路-2561282536966961999879会让您脱离REPL。
(仅适用于某些带有运算符重载的语言,包括Python :) a_boolean & another_boolean和and是常规运算符,可以重载-and和or被伪造成该语言(尽管至少在Python中,强制布尔化的特殊方法可能具有 副作用)。
(仅适用于几种语言[请参阅KennyTM的评论] :) 2561282536966961999872和and返回(总是?从来没有真正理解过,也不需要它)操作数的值,而不是25612825369619991999874或25612825369619991999875。这不会改变含义 条件中的布尔表达式的总和-25612825369619991999是2561282536966961999877,但1也是如此。 但是它曾经被用来模拟条件运算符(几年后使用C语法为2561282536966961999879,使用Python则为2561282536966961999880)。 对于25612825369619991999和|,结果类型取决于操作数如何重载相应的特殊方法(True & False为False、25612825369619991999885为25612825369619991999886,对于集合,其为并集/相交...)。
但即使例如 a_boolean & another_boolean可以相同地工作,正确的解决方案是使用2561282536966961999873-仅仅因为25612825369619991999874和or与布尔表达式和条件相关联,而&和25612825369619991999则代表位旋转。
answered -10-09T06:21:35Z
14 votes
这是一个进一步的差异,刚才让我感到困惑的是:由于&(和其他按位运算符)的优先级高于False(和其他布尔运算符),因此以下表达式求值不同:
0 < 1 & 0 < 2
与
0 < 1 and 0 < 2
简而言之,第一个产生False,因为它等效于0 < (1 & 0) < 2,因此0 < 0 < 2,因此0 < 0 and 0 < 2。
Arend answered -10-09T06:22:20Z
4 votes
如果您尝试在numpy中执行按元素进行布尔运算,则答案有些不同。 您可以将&和&和|用于按元素进行布尔运算,但是and和or将返回值错误。
为了安全起见,您可以使用numpy逻辑函数。
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)
C8H10N4O2 answered -10-09T06:23:11Z
2 votes
布尔运算是逻辑运算。
按位运算是对二进制位的运算。
按位运算:
>>> 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
>>>
pyfunc answered -10-09T06:24:27Z
2 votes
提示在名称中:
布尔运算符用于执行逻辑运算(编程和形式逻辑中常见的真相测试)
按位运算符用于“位扭曲”(字节和数字数据类型中的位的低级操作)
尽管可能并且确实有时(通常出于效率原因)希望使用按位运算符执行逻辑运算,但出于这种目的,通常应避免使用它们,以防止出现细微的错误和不良的副作用。
如果需要操纵位,则将按位构建按位运算符。 这本有趣的书:《 Hackers Delight》包含了一些酷而真正有用的示例,这些示例可以通过位旋转实现。
Tendayi Mawushe answered -10-09T06:25:31Z
1 votes
一般规则是对现有的操作数使用适当的运算符。 将布尔(逻辑)运算符与布尔操作数一起使用,将按位运算符与(较宽)整数操作数一起使用(注意:False等于0,True等于1)。 唯一的“棘手”方案是将布尔运算符应用于非布尔操作数。
让我们举一个简单的示例,如[SO]中所述:Python-“和”与“&”之间的区别[重复项]:5 = 0b101
7 = 0b111
-----------------
5 & 7 = 0b101 = 5与5 and 7。
对于按位和(&),事情非常简单:
5 = 0b101
7 = 0b111
-----------------
5 & 7 = 0b101 = 5
对于逻辑和,这里是[Python 3]:布尔运算的状态(强调是我的):
(请注意,以及和或或限制值和类型都不会返回False和True,而是返回最后一个求值的参数。
例:
>>> 5 and 7
7
>>> 7 and 5
5
当然,| 与。
CristiFati answered -10-09T06:26:58Z
0 votes
布尔值“ and”与按位“&”:
伪代码/ 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 (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)
Geoff Langenderfer answered -10-09T06:27:41Z