1# see https://docs.python.org/3/reference/expressions.html#operator-precedence
2
3# '|' is the least binding numeric operator
4
5# '^'
6# OK:  1 | (2 ^ 3) = 1 | 1 = 1
7# BAD: (1 | 2) ^ 3 = 3 ^ 3 = 0
8print(1 | 2 ^ 3)
9
10# '&'
11# OK:  3 ^ (2 & 1) = 3 ^ 0 = 3
12# BAD: (3 ^ 2) & 1 = 1 & 1 = 1
13print(3 ^ 2 & 1)
14
15# '<<', '>>'
16# OK:  2 & (3 << 1) = 2 & 6 = 2
17# BAD: (2 & 3) << 1 = 2 << 1 = 4
18print(2 & 3 << 1)
19# OK:  6 & (4 >> 1) = 6 & 2 = 2
20# BAD: (6 & 4) >> 1 = 2 >> 1 = 1
21print(6 & 4 >> 1)
22
23# '+', '-'
24# OK:  1 << (1 + 1) = 1 << 2 = 4
25# BAD: (1 << 1) + 1 = 2 + 1 = 3
26print(1 << 1 + 1)
27
28# '*', '/', '//', '%'
29# OK:  2 + (2 * 2) = 2 + 4 = 6
30# BAD: (2 + 2) * 2 = 4 * 2 = 8
31print(2 + 2 * 2)
32
33# '+x', '-x', '~x'
34
35# '**'
36# OK:  -(2**2) = -4
37# BAD: (-2)**2 = 4
38print(-2**2)
39# OK: 2**(-1) = 0.5
40print(2**-0)
41
42# (expr...)
43print((2 + 2) * 2)
44