繁体   English   中英

我该如何解决这种 python 表达式?

[英]How do I can solve this kind of python expression?

我有两个表达式,如下所示:

a,b,c=2,4,5

print(a|b*c)
output : 22

How it is returning me the 22

第二个表达式是:

print(a|b^c)

output : 3

谁能向我解释一下 python 是如何计算这个的? 我是 python 的新手,我不知道它是如何计算的。

表达#1

让我们考虑一下,

a|b*c

* (乘法)的Precedence大于| (按位或)这就是为什么第一个b*c将被计算,然后它的 output 将被计算a

脚步:

1- b*c将返回 20。

2- 然后a将与b*c执行按位或运算。 请参见Bitwise OR operation (当有任何一个时 OR 返回 1,否则为 0)

3- 将ab*c的值转换为二进制并执行按位运算。 请参阅Convert decimal to binary

      1 0     > a = 2
1 0 1 0 0     > b*c = 20
_________
1 0 1 1 0     > a|b*c = 22

表达#2

让我们考虑一下,

a|b^c

^ (按位异或)的Precedence大于| (按位或)这就是为什么第一个b^c将被计算,然后它的 output 将被计算a

脚步:

1- 将在 b 和 c (b^c) 之间执行按位异或运算。 请参见Bitwise XOR operation (当有奇数个时,异或返回 1,否则为 0)

1 0 0   > b = 4
1 0 1   > c = 5
______   
0 0 1   > b^c = 1

2- 然后a将与b^c执行按位或运算。 请参见Bitwise OR operation (当有任何一个时 OR 返回 1,否则为 0)

1 0   > a =2
0 1   > b^c = 1
___
1 1   > a|b^c = 3

打印(a|b*c)

由于运算符优先级,乘法( * )将在按位或( | )之前处理,因此操作将按以下顺序进行:

  1. b*c = 4*5 = 20
  2. a|b*c = 2|20 ,即10 OR 10100 = 10110二进制

这给了我们22的最终答案。

打印(a|b^c)

同样,由于运算符优先级,按位异或 (^ ˆ将首先处理,因此我们将有:

  1. bˆc = 4ˆ5 ,即二进制的100 XOR 101 = 001
  2. a|bˆc = 2|1 ,即二进制的10 OR 01 = 11

这给了我们一个3的最终答案。

这是按位和 integer 算术运算的混合。

这是如何运作的?

根据docs中定义的运算符的优先顺序,要计算的第一个表达式是 b*c,它返回 20。然后我们计算表达式 a|20。 这是对两个整数的按位运算,所以我们正在做的是对这两个数字的二进制表示的每一位进行逻辑或,即 (00010) | (10100) 这给了我们 (10110) 即 22

同样,在第二个例子中,我们首先对 b 和 c 进行 XOR,等于 1(计算为二进制 100 XOR 101 = 001)。 然后将结果与 a 进行按位或运算,返回值 3

算术运算符 * , /, +, -的优先级大于位运算符&, |, ^并且如果找到相同的优先级,则从左到右计算两种类型的运算符。

而且,

  • 算术运算符的优先顺序是: * ,/ 然后 +,-
  • 对于按位运算符,优先顺序为: &、^、|

查看这篇文章了解更多信息

来到解决方案:

  1. 第一个表达式的计算结果如下: a|(b*c)
  2. 第二个表达式的计算结果如下:a|(b^c)

您需要将这些数字分解为它们的二进制表示,以了解幕后发生的事情。

情况1,

(2) 的二进制 - 00010

b*c 的二进制 (20) - 10100

因此,如果您执行按位或 (|),您将得到上述两个的二进制和,即 10110 = 22

案例2,

(2) 的二进制 - 00010

b (4) 的二进制 - 00100

c (5) - 00101 的二进制文件

同样,如果您执行按位异或 (^),您将得到 b 和 c 的二进制异或,即 00001= 1

最后,如果您执行按位 OR (|),您将得到 a 与 b^c 的二进制和,即 00011 = 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM