正數(shù)的原碼、反碼兔魂、補(bǔ)碼都是一樣的
負(fù)數(shù)第一位是1烤芦,表示負(fù)數(shù),反碼是在原碼的基礎(chǔ)上入热,符號位不動拍棕,其余取反;補(bǔ)碼是反碼+1
1勺良、<< 左移
規(guī)則是帶符號位移绰播,高位移出,低位補(bǔ)0尚困。左移一位相當(dāng)于乘以2的一次方蠢箩,左移n位相當(dāng)于乘以2的n次方。(往左手邊移動)
注:以下數(shù)據(jù)類型默認(rèn)為byte---8位
左移時不管正負(fù)事甜,低位補(bǔ)0
正數(shù):**r = 20 << 2**
20的二進(jìn)制補(bǔ)碼:0001 0100
向左移動兩位后:0101 0000
結(jié)果:r = 80(20*2^2)
20的二進(jìn)制補(bǔ)碼:0000 0001 0100
向左移動四位后:0001 0100 0000
結(jié)果:r = 320(20*2^4)
負(fù)數(shù):**r = -20 << 2**
-20 的二進(jìn)制原碼 :1001 0100
-20 的二進(jìn)制反碼 :1110 1011
-20 的二進(jìn)制補(bǔ)碼 :1110 1100
左移兩位后的補(bǔ)碼:1011 0000
反碼:1010 1111
原碼:1101 0000
結(jié)果:r = -80
左移四位后的補(bǔ)碼:1110 1100 0000
反碼:1110 1011 1111
原碼:1001 0100 0000
結(jié)果:r = -320
2谬泌、>>右移
如果該數(shù)為正,則高位補(bǔ)0逻谦,若為負(fù)數(shù)掌实,則高位補(bǔ)1;
(往右手邊移動)
注:以下數(shù)據(jù)類型默認(rèn)為byte-8位
正數(shù):r = 20 >> 2
20的二進(jìn)制補(bǔ)碼:0001 0100
向右移動兩位后:0000 0101
結(jié)果:r = 5
負(fù)數(shù):r = -20 >> 2
-20 的二進(jìn)制原碼 :1001 0100
-20 的二進(jìn)制反碼 :1110 1011
-20 的二進(jìn)制補(bǔ)碼 :1110 1100
右移兩位后的補(bǔ)碼:1111 1011
反碼:1111 1010
原碼:1000 0101
結(jié)果:r = -5
3邦马、>>> 無符號右移
也叫邏輯右移贱鼻,即若該數(shù)為正,則高位補(bǔ)0滋将,而若該數(shù)為負(fù)數(shù)邻悬,則右移后高位同樣補(bǔ)0
正數(shù): r = 20 >>> 2
的結(jié)果與 r = 20 >> 2 相同;
負(fù)數(shù): r = -20 >>> 2
注:以下數(shù)據(jù)類型默認(rèn)為int 32位
-20:原碼:10000000 00000000 00000000 00010100
反碼:11111111 11111111 11111111 11101011
補(bǔ)碼:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
結(jié)果:r = 1073741819
案例舉例
byte[3]={-2,64,101};
字節(jié)里面存的是帶符號的十進(jìn)制随闽,需要轉(zhuǎn)換成補(bǔ)碼的形式進(jìn)行各種計算
-2
原碼:1000 0010
反碼:1111 1101
補(bǔ)碼:1111 1110
64
原碼:0100 0000
101
原碼:0110 0101
每個字節(jié)都是8位父丰,合起來就是1111 1110,0100 0000掘宪,0110 0101
現(xiàn)在需求是這樣:
分別取前12位和后12位算出十進(jìn)制int值
也就是1111 1110蛾扇,0100和0000攘烛,0110 0101
代碼運(yùn)算應(yīng)該怎么實現(xiàn)?