布尔运算符与位运算符

2024-12-09 08:31:00
admin
原创
135
摘要:问题描述:我对何时应使用布尔运算符和按位运算符感到困惑and对比&or对比|有人可以告诉我什么时候该使用哪一个,以及什么时候使用哪一个会对我的结果产生影响吗?解决方案 1:以下是一些指导原则:布尔运算符通常用于布尔值,但按位运算符通常用于整数值。布尔运算符是短路的,但按位运算符不是短路的。短路行为在如...

问题描述:

我对何时应使用布尔运算符和按位运算符感到困惑

  • 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:

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

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

  1. and并且or短路,例如True or sys.exit(1)不会退出,因为对于第一个操作数(True or ...False and ...)的某个值,第二个操作数不会改变结果,因此不需要进行评估。但是,|并且&不短路 -True | sys.exit(1)会将您赶出 REPL。

  2. &|是常规运算符,可以重载,而andor被融入语言中(尽管强制转换为布尔值的特殊方法可能会有副作用)。

    • 这也适用于其他一些具有运算符重载的语言

  3. andandor返回操作数的值,而不是Trueor False。这不会改变条件中的布尔表达式的含义 - 1 or Trueis 1,但1也是 true。但它曾经被用来模拟条件运算符(cond ? true_val : false_val在 C 语法中,true_val if cond else false_val在 Python 中)。对于&and |,结果类型取决于操作数如何重载相应的特殊方法(True & Falseis False99 & 7is 3,对于集合则是并集/交集……)。

    • 这也适用于其他一些语言,如 Ruby、Perl 和 Javascript

但即使例如a_boolean & another_boolean可以相同地工作,正确的解决方案是使用and- 仅仅因为andor与布尔表达式和条件相关,而&|代表位摆弄。

解决方案 4:

如果您尝试在 中进行逐元素布尔运算numpy,答案会有所不同。您可以使用&|进行逐元素布尔运算,但andor将返回值错误。

为了安全起见,您可以使用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相当于0True相当于1)。唯一“棘手”的情况是将布尔运算符应用于非布尔操作数。
让我们举一个简单的例子:vs.
5 & 7 5 and 7

对于按位&),事情非常简单:

5     = 0b101
7     = 0b111
-----------------
5 & 7 = 0b101 = 5 (= 7 & 5)

对于逻辑,以下是[Python.Docs]: 布尔运算所述(重点是我的):

请注意,and 和or都不会限制它们返回的值和类型为FalseTrue,而是返回最后评估的参数

例子

>>> 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,否则为 0

  • XOR ^:如果位不同则为 1,如果位相同则为 0

  • NOT ~':翻转每一位

按位运算的一些用途:

  1. 设置和清除位

布尔运算:

>>> 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==2b>10)同时为真,则可以执行条件语句体。

按位运算

用于数据操作和提取。例如,如果要提取整数的四个 LSB(最低有效位),可以执行以下操作:

p & 0xF
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用