正數的原碼、反碼、補碼都是一樣的
負數第一位是1,表示負數,反碼是在原碼的基礎上,符號位不動,其余取反;補碼是反碼+1
1、<< 左移
規則是帶符號位移,高位移出,低位補0。左移一位相當于乘以2的一次方,左移n位相當于乘以2的n次方。(往左手邊移動)
注:以下數據類型默認為byte---8位
左移時不管正負,低位補0
正數:**r = 20 << 2**
20的二進制補碼:0001 0100
向左移動兩位后:0101 0000
結果:r = 80(20*2^2)
20的二進制補碼:0000 0001 0100
向左移動四位后:0001 0100 0000
結果:r = 320(20*2^4)
負數:**r = -20 << 2**
-20 的二進制原碼 :1001 0100
-20 的二進制反碼 :1110 1011
-20 的二進制補碼 :1110 1100
左移兩位后的補碼:1011 0000
反碼:1010 1111
原碼:1101 0000
結果:r = -80
左移四位后的補碼:1110 1100 0000
反碼:1110 1011 1111
原碼:1001 0100 0000
結果:r = -320
2、>>右移
如果該數為正,則高位補0,若為負數,則高位補1;
(往右手邊移動)
注:以下數據類型默認為byte-8位
正數:r = 20 >> 2
20的二進制補碼:0001 0100
向右移動兩位后:0000 0101
結果:r = 5
負數:r = -20 >> 2
-20 的二進制原碼 :1001 0100
-20 的二進制反碼 :1110 1011
-20 的二進制補碼 :1110 1100
右移兩位后的補碼:1111 1011
反碼:1111 1010
原碼:1000 0101
結果:r = -5
3、>>> 無符號右移
也叫邏輯右移,即若該數為正,則高位補0,而若該數為負數,則右移后高位同樣補0
正數: r = 20 >>> 2
的結果與 r = 20 >> 2 相同;
負數: r = -20 >>> 2
注:以下數據類型默認為int 32位
-20:原碼:10000000 00000000 00000000 00010100
反碼:11111111 11111111 11111111 11101011
補碼:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
結果:r = 1073741819
案例舉例
byte[3]={-2,64,101};
字節里面存的是帶符號的十進制,需要轉換成補碼的形式進行各種計算
-2
原碼:1000 0010
反碼:1111 1101
補碼:1111 1110
64
原碼:0100 0000
101
原碼:0110 0101
每個字節都是8位,合起來就是1111 1110,0100 0000,0110 0101
現在需求是這樣:
分別取前12位和后12位算出十進制int值
也就是1111 1110,0100和0000,0110 0101
代碼運算應該怎么實現?
5df3b5e7ae20264461ab18f4c98cca5.jpg