1 # 二、位运算符
2 # 对于二进制补码按位进行运算
3 # & 与:两个操作数都取补码,对位进行&,如果两个位都是1,则返回1,否则返回0
4 # | 或:对位进行|,如果两个位中有一个为1,则结果为1,否则为0
5 # ^ 异或:对位进行^,如果两个位不一样为1,否则为0
6 # << 左位移:对于补码进行向左移动,右边使用符号位0补齐。每移动一位,则相当于*2
7 # >> 右位移:对于补码进行向右移动,左侧以符号位填充。每移动一位,相当于除以2,如果不能整除,则相当于向下取整
8 # ~ 按位取反:一元运算符 ,获得补码,包括符号位都取反。
9 a=0b10001
10 b=0b01011
11 # 00001
12
13 c=-2
14 d=5
15 # -2 1010 1110补码
16 # 0101 0101补码
17 # 0100补码
18 print(c&d)
19
20 # -2 1010 1110补码
21 # 0101 0101补码
22 # | 1111补码 1001---- -1
23 print(c|d)
24
25 # -2 1010 1110补码
26 # 0101 0101补码
27 # 1011补码 1101---- -5
28 print(c^d)
29
30 # 2
31 # 0010
32 #00100---4
33 print(2<<1)
34
35
36 # 2
37 # 0000 0010
38 # 00 001000---8
39 print(2<<2)
40
41 print(2<<3)#---16 2*2**3=16
42
43 print(15<<3) #15*2**3
44
45
46
47 # 2 >>1
48 #0010
49 #0001----1
50 print(2>>1)
51
52 #15 >>1
53 # 0000 1111
54 # 0000 0111-----7 15//2 =7
55 print(15>>1)
56 print(-15>>1)
57
58 # 0000 1111
59 # 1111 0000----10010000--- - 16
60 print(~15)
# 以十六位机模拟:
# -27-------->二进制补码 0b 1000 0000 0001 1011
# -27<<3----->-27左移3位的二进制补码 0b 1000 0000 1101 1000------>十进制 -216
# -27>>3----->-27右移3位的二进制补码 0b 1000 0000 0000 0100------>十进制 -4
print(-27<<3)
print(-27>>3)
num = int(input('请输入一个数字:'))
# 位运算中左移n为相当于2^n,则 7 = 2^3 - 2^0,理解为num向左移3位减去num
print((num << 3) - num)
乘法运算:左移n位相当于乘以2^n,所有的数字均可由此变化
除法运算:右移n位相当于除以2^n,除不尽的向下取整