布尔运算符与位运算符
- 2024-12-09 08:31:00
- admin 原创
- 73
问题描述:
我对何时应使用布尔运算符和按位运算符感到困惑
and
对比&
or
对比|
有人可以告诉我什么时候该使用哪一个,以及什么时候使用哪一个会对我的结果产生影响吗?
解决方案 1:
以下是一些指导原则:
布尔运算符通常用于布尔值,但按位运算符通常用于整数值。
布尔运算符是短路的,但按位运算符不是短路的。
短路行为在如下表达式中很有用:
if x is not None and x.foo == 42:
# ...
这在使用位运算符时无法正确工作&
,因为两边始终会被求值,从而得到AttributeError: 'NoneType' object has no attribute 'foo'
。使用布尔and
运算符时,如果第一个表达式为 False,or
则不会求第二个表达式的值。同样,如果第一个表达式为 True,则不会求第二个参数的值。
解决方案 2:
这里有一个进一步的区别,刚才让我困惑了一段时间:因为&
(和其他按位运算符)比(和其他布尔运算符)具有更高的优先级and
,所以以下表达式计算出不同的值:
0 < 1 & 0 < 2
相对
0 < 1 and 0 < 2
即,第一个结果是False
,因为它等同于0 < (1 & 0) < 2
,因此0 < 0 < 2
,因此0 < 0 and 0 < 2
。
解决方案 3:
理论上,and
和or
直接来自布尔逻辑(因此对两个布尔值进行运算以产生一个布尔值),而&
和|
将布尔值和/或应用于整数的各个位。关于后者究竟如何工作,这里有很多问题。
以下是可能影响结果的实际差异:
and
并且or
短路,例如True or sys.exit(1)
不会退出,因为对于第一个操作数(True or ...
,False and ...
)的某个值,第二个操作数不会改变结果,因此不需要进行评估。但是,|
并且&
不短路 -True | sys.exit(1)
会将您赶出 REPL。&
和|
是常规运算符,可以重载,而and
和or
被融入语言中(尽管强制转换为布尔值的特殊方法可能会有副作用)。这也适用于其他一些具有运算符重载的语言
and
andor
返回操作数的值,而不是True
orFalse
。这不会改变条件中的布尔表达式的含义 -1 or True
is1
,但1
也是 true。但它曾经被用来模拟条件运算符(cond ? true_val : false_val
在 C 语法中,true_val if cond else false_val
在 Python 中)。对于&
and|
,结果类型取决于操作数如何重载相应的特殊方法(True & False
isFalse
,99 & 7
is3
,对于集合则是并集/交集……)。这也适用于其他一些语言,如 Ruby、Perl 和 Javascript
但即使例如a_boolean & another_boolean
可以相同地工作,正确的解决方案是使用and
- 仅仅因为and
和or
与布尔表达式和条件相关,而&
和|
代表位摆弄。
解决方案 4:
如果您尝试在 中进行逐元素布尔运算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)
解决方案 5:
一般规则是使用适当的运算符来处理现有的操作数。对布尔操作数使用布尔(逻辑)运算符,对(更宽的)整数操作数使用位运算符(注意:False相当于0,True相当于1)。唯一“棘手”的情况是将布尔运算符应用于非布尔操作数。
让我们举一个简单的例子:vs.。 5 & 7
5 and 7
对于按位与(&),事情非常简单:
5 = 0b101 7 = 0b111 ----------------- 5 & 7 = 0b101 = 5 (= 7 & 5)
对于逻辑与,以下是[Python.Docs]: 布尔运算所述(重点是我的):
请注意,and 和or都不会限制它们返回的值和类型为False和True,而是返回最后评估的参数。
例子:
>>> 5 and 7 7 >>> 7 and 5 5
当然,同样适用于| 与 or 。
解决方案 6:
名字里就暗示了:
布尔运算符用于执行逻辑运算(编程和形式逻辑中常见的真值测试)
位运算符用于“位操作”(对字节和数字数据类型中的位进行低级操作)
尽管使用按位运算符执行逻辑运算是可能的,而且有时确实是可取的(通常是出于效率原因),但通常应避免将它们用于此类目的,以防止出现细微的错误和不必要的副作用。
如果您需要操作位,那么位运算符就是专门为该目的而设计的。有趣的书:Hackers Delight包含一些很酷且真正有用的示例,说明了使用位操作可以实现哪些功能。
解决方案 7:
布尔运算是逻辑运算。
按位运算是对二进制位的运算。
按位运算:
>>> k = 1
>>> z = 3
>>> k & z
1
>>> k | z
3
操作:
AND
&
:如果两位均为 1,则为 1,否则为 0或
|
:如果任一位为 1,则为 1,否则为 0XOR
^
:如果位不同则为 1,如果位相同则为 0NOT
~
':翻转每一位
按位运算的一些用途:
设置和清除位
布尔运算:
>>> k = True
>>> z = False
>>> k & z # and
False
>>> k | z # or
True
>>>
解决方案 8:
布尔“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)
解决方案 9:
逻辑运算
通常用于条件语句。例如:
if a==2 and b>10:
# Do something ...
意思是如果两个条件(a==2
和b>10
)同时为真,则可以执行条件语句体。
按位运算
用于数据操作和提取。例如,如果要提取整数的四个 LSB(最低有效位),可以执行以下操作:
p & 0xF
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件