# ###(7)位运算符:    & | ~ ^ << >>
var1 = 19
var2 = 15
# & 按位与
res = var1 & var2
print(res)
'''
10011
01111
00011
'''
# | 按位或
res = var1 | var2
print(res)
'''
10011
01111
11111
'''
 
 
# << 左移
""" n<<m  n乘以2的m次幂  """
res = 5 << 2  # 相当于5 * 2的2次幂
"""
00000101
00010100
4+16 = 20
"""
 
# >> 右移
'''n>>m n除以2的m次幂'''
res = 5 >> 1
"""
00000101
00000010
"""
print(res)
 
# ^ 按位异或
"""两个值[不相同]方为真,两个值[相同]方为假"""
res = var1 ^ var2
'''
10011
01111
11100 
'''
print(res)
# ~ 按位非    - ( n+1 )
res = ~19
res = ~-21
print(res)
 
 
# 运算符的优先级
'''
一元运算符: 同一时间只操作一个数字运算的 ( ~ - ) ~19
二元运算符: 同一时间只操作两个数字运算的 (+ - * /) 5 + 3
 
整体一元运算符优先级 > 二元运算符
所有运算符当中 ** 幂运算优先级最高
所有运算符当中 = 赋值运算符优先级最低
 
单独的一种运算符优先级顺序如下:
乘 除 > 加 减
() > not > and > or
~ > (<< >>)> & > ^ > |
 
除此之外,剩下的运算符优先级如下:
算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
赋值运算符 单独拿出来作为最后,把值计算好之后再进行赋值
'''
res = 5+5 << 6 // 3 is 40 and True
print(res) # True 
'''
5+5 << 2 is 40 and True
10 << 2 is 40 and True
40 is 40 and True
True and True => True 
'''
# 用一个小括号抱起来 作为一个整体,让别人能够看懂代码
res = (5+5) << (6 // 3) is 40 and True 
print(res)