一、位運算
位運算 |
描述 |
示例 |
& |
按位與運算符:參與運算的兩個值,如果兩個相應位都為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.運算符的優先級 :()