一、位运算
位运算 |
描述 |
示例 |
& |
按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 |
(a & b)输出结果12,二进制解释:0000 1100 |
| |
按位或运算符:只要对应的两个二进制位1时,结果位就为1 |
(a | b)输出结果61,二进制解释:0011 1101 |
^ |
按位异或运算符:当两对应的二进制相异时,结果为1 |
a ^ b)输出结果49,二进制解释:0011 0001 |
~ |
按位取反运算符:对数据的每个二进制取反,把1变为0,把0变为1,~x类似于-x-1 |
(~a )输出结果-61.二进制解释:1100 0011,在一个有符号二进制数的补码形式 |
<< |
左移动运算符:运算符的各二进制全部左移若干位,由<<右边的数字指定了移动的位数,高位丢弃,低位补0 |
a << 2输出结果240,二进制解释:1111 0000 |
>> |
右移动运算符:把>>左边的运算数的各二进制位全部右移若干位,>>右边的数字指定了移动的位数 |
a >> 2输出结果15,二进制解释:0000 1111 |
位运算:针对二进制进行的运算
& | ^ ~ << >>
Ture and Ture ------>Ture
False and False------>False
&:
按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
当二进制有重合时,结果时保留重合那部分的数值
1 为真 0 为假
n1 = 0b0110 #6
n2 = 0b0010 #2
print(n1 & n2)
0&0 ------> 0
1&1 ------> 1
1&0 ------> 0
0&1 ------> 0
|:
按位或运算符:只要对应的两个二进制位1时,结果位就为1
二进制对比,有1就保留
print('*' *20)
print(n1|n2)
print(5|9)
^:
按位异或运算符:当两对应的二进制相异时,结果为1
(异或)上下两个数位相同为0,不同为1
n1 = 0b0110 #6
n2 = 0b0010 #2
print(n1 ^ n2)
~:
按位取反运算符:对数据的每个二进制取反,把1变为0,把0变为1,~x类似于-x-1
n1 = 0b0110 #6
n2 = 0b0010 #2
print('*' *20)
print(~n1) #0000 0110 ------> 取反:1111 1001
print(~5) #0000 0101 ------> 1111 1010
二进制的负数表示:
原码 0110
反码 1001
补码 反码+1 1001
+ 1
---------------
1010
明确:
1.已知十进制负数,求二进制负数:
①.正数的原码 ②.原码取反 ③.加1 ------> 得到的二进制就是负数的二进制
-7的进制:
步骤:
1.先求+7的二进制原码:0000 0111
2.反码:1111 1000
3.补码:1111 1001
-7的二进制是:1111 1001
2.已知二进制的负数(判断是否是负的二进制的依据,看二进制的最高位:1111 1010,最高位是1则为负数,0则为整数)
①二进制(负的) ②二进制减1 ③取反 ④原码 将原码转成十进制,在十进制的前面添加负号:-
已知:二进制:1111 1010,十进制表示 -6
1111 1010
- 1
--------------------
1111 1001 ------> 反码
原码:0000 0110 ------> 6
-6
3.~5 ------> 就是将5的二进制取反
练习:
1.~7 打印出来的十进制是多少?-8
0000 0111 ------> 1111 1000
减1:1111 0111
取反 0000 1000
原码 0000 1000
十进制:-8
2.-9的二进制表示 1111 0111
3.~-4,打印出来的十进制是多少?3
先得到-4的二进制
00000100
11111011
11111100------>取反 0000 0011
4.1111 1101 的十进制表示
减1 11111100
取反 00000011
原码 00000011
十进制 -3
<<
n = 12 # 00001100
print( n << 1) # 24 12*2
print( n << 2) # 48 12*2*2 往左移动两位,后面补两个零
print( n << 3) # 96 12*2*2*2
总结:12*2的n次方
n = 12 #00001100
print( n >> 1) # 6 12//2 --->6
print( n >> 2) # 3 12//4
print( n >> 3) # 1 12//8
n = 89 右移五位
n = 93 左移三位
print(89 >> 5)
print(93 << 3)
二、运算符优先级
x = 20
result = 20*5**2
a = 1
b = 2
print(b>a+x<a+b)
print(b>a+(x<a+b)) #Ture
print(a+False) # False=0
总结:
1.算术运算符
2.赋值运算符 = += -=
3.比较运算符 > < == != …
4.逻辑运算符 and or not
5.位运算 & | ^ ~ << >> 负数的二进制
6.运算符的优先级 :()