A,原碼反碼補碼
1,二進制
二進制的最高位是符號位,0為正,1為負
例
3 => 0000 0011
-3 => 1000 0011
2,正數
正數的原碼,反碼,補碼都一樣(三碼合一)
例
3 => 0000 0011(原碼)
????????0000 0011(反碼)
????????0000 0011(補碼)
3,負數?
負數的反碼:原碼符號位不變,其他取反(0變1,1變0)
例
-3 =>
原碼1000 0011
反碼1111 1100
負數的補碼:反碼加一
負數的反碼:補碼減一
例
-3 =>
反碼1111 1100
補碼1111 1101
4,0
0的反碼補碼都是0?
5,計算機運算
計算機運算時,以補碼的方式運算,查看運算結果時,需要看原碼
例
1=>補碼0000 0001
-3=>補碼1111 1101
1 - 3 =>補碼0000 0100
原碼0000 0100
——>
4
1=>補碼0000 0001
-3=>補碼1111?1101
1 -?3 =>補碼1111 1110
反碼1111 1101
原碼1000 0010
——>
-2
B,位運算
位運算符 | 描述 |
+x,-x,~x | 正,負,按位非NOT |
>> << | 右移 左移 |
& | 按位與 |
^ | 按位異或 |
| | 按位或 |
????????
1,~按位取反
規則:對數據的每個二進制取反,1為0,0為1
例
~2
原碼:0000 0010
補碼:0000 0010
2 按位取反
補碼:1111 1101
原碼:1000 0011
——>
結果:-3
~-2?
原碼:1000 0010
補碼:1111 1110
-2?按位取反
補碼:0000 0001
原碼:0000 0001
——>
結果:1
2,&按位與
規則:參與運算的兩個值,如果兩個補碼對應的位置都為一,則該位結果為一,否則為0
例
2 & 3
2補碼:0000 0010
3補碼:0000 0011
2 & 3補碼:0000 0010?補碼=原碼
——>2
3,^按位異或
規則:如果兩個補碼對應的位置相異,則該位結果為一,否則為0
例
2^-3
2補碼:0000 0010
-3補碼:1111 1101
2 ^ -3補碼:1111 1111
2 ^ -3原碼:1000 0001
——>-1
4,按位或
規則:如果兩個補碼對應的位置有一個為一,則該位結果為一,否則為0
例
2|3
2補碼:0000 0010
3補碼:0000 0011
2|3補碼:0000 0011
——>3
5,<<左移
規則:二進位全部左移n位,n是<<右邊的數,且符號位不變,高位丟棄,低位補0
例
5<<1
5補碼:0000 0101
5<<1補碼:0000 1010 左移一位等于*2
——>10
6,>>右移
規則:二進位全部右移n位,n是<<右邊的數,且符號位不變,低位溢出,用符號位補溢出的高位
例
5>>1
5補碼:0000 0101
5>>1補碼:0000 0010
——>2
C,練習
1,
定義
a=1>>2
b=-1>>2
c=1<<2
d=-1<<2
輸出
print(a)
print(b)
print(c)
print(d)
——>
0
-1
4
-4