【问题标题】:Don't understand why if (5 & 2): is False不明白为什么 if (5 & 2): 是 False
【发布时间】:2020-12-31 04:46:49
【问题描述】:

这是一个非常琐碎的问题,我一直无法找到答案。

这就是问题所在。

#1

if 3 & 2:
    print('True')
else:
    print('False')
#1 result = True

#2

if 5 & 2:
    print('True')
else:
    print('False')
#2 result = False

我认为原因是位运算符,但我不明白这种情况。

任何澄清将不胜感激。

【问题讨论】:

  • 这个5 & 2的逐位and运算结果为零

标签: python if-statement


【解决方案1】:

这里发生了两件事:

  • 按位运算本身。

    • & 的输出是一个数字,每个位都有 1,其中相应位在两个操作数中为 1,在其他位置为 0。在这种情况下(二进制)5 & 2 你有操作数101010,因此二进制输出000 或十进制:0,而对于3 & 2,你有操作数1110,因此二进制输出 10 或十进制:2
  • 条件为整数时if的动作:

    • 如果条件是整数,如果值非零,则将其视为真值,而将 0 视为假值。因此在5 & 2 的情况下,0 被视为假,else 块将被执行,而在3 & 2 的情况下,2 被视为真,if 块被执行。

把这些放在一起,回想一下 2 是 2 的精确幂(在这种情况下是 2 的 1 次幂),这本质上是在测试,如果你用二进制写另一个数字,2s 数字是否是设置(即等于1)与否。此编码模式通常用于您有一个表示bit field 的数字并且您想测试是否设置了特定位的情况。例如,os.open 函数的flags 参数(它的第二个参数)是一个位字段。您可以测试是否在 flags 值中设置了某个感兴趣的特定位,您可能会将其发送到该函数:

import os
print(os.O_RDWR)  # 2 - in binary 10
print(os.O_TRUNC)  # 512 - in binary 1000000000
flags = os.O_RDWR | os.O_TRUNC  # does bitwise OR to set the flags
print(flags)  # 514 - in binary this is 1000000010

if flags & os.O_RDWR:
    print("O_RDWR is set")  # this print is executed because the 2s digit is set

【讨论】:

    【解决方案2】:
    if 3 & 2:
        print('True')
    else:
        print('False')
    

    &,|, ^ 在 python 中用作按位运算符。其他语言如 C 或 C++ 将使用 &&, || 作为比较运算符,这可能会导致 python 中的一些混乱。

    所以在上面的代码中,3 & 2 会以这些以 10 为基数的二进制形式计算它。所以它会变成11 & 10,它会被评估为10,即2。在 python 中,0 在条件语句中将被视为False,而2 将成为True,因此您的代码将打印 True。

    您可以在此处阅读有关 python 中的运算符和真值的信息:https://docs.python.org/3/library/stdtypes.html

    【讨论】:

      【解决方案3】:

      & 是按位与运算符,因此它将对每个位执行 AND,如果其中一位为 1,则输出为真。

      如果您观察 5 和 2 的位形式,则 5 是 2 的补码(5 是 101,2 是 010)。因此,根据 AND 逻辑表 A.A' 始终等于 0。这就是为什么您的答案是 false

      【讨论】:

        【解决方案4】:

        在 Python 中,单个 & 符号 & 是二元 AND 运算符。 意思是对给定数字的每一位执行操作。

        如果我们查看二进制中 2 和 3 的值:

        DEC:  2 &  3 =  2
        BIN: 10 & 11 = 10
        
        

        而 5 和 2:

        DEC:   5 &   2 =   0
        BIN: 101 & 010 = 000
        

        旁注:

        如果您打算使用逻辑 AND 来检查两个值是否不为 False(数字不为 0),那么您应该使用关键字 and

        【讨论】:

          猜你喜欢
          • 2019-08-09
          • 1970-01-01
          • 2013-01-25
          • 2023-02-05
          • 1970-01-01
          • 2014-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多