1. 程式人生 > >關於java原碼,補碼,反碼和移位運算的一些總結

關於java原碼,補碼,反碼和移位運算的一些總結

整數的原碼,補碼,反碼是一致的
負數的反碼=原碼取反(符號為不變)
負數的補碼=負數的反碼+1;
重點:在JAVA裡,使用8進位制和16進位制給一個int值賦值時,是直接存的補碼!!!並且運算時也是採取補碼的形式運算。
下面為測試例子:
這裡寫圖片描述
0x82表示為2進位制:10000010,如果0x82是原碼的話,那麼輸出應該為-2,如果0x82為補碼,那麼原碼為11111110,輸出應該為-126。輸出如下:
這裡寫圖片描述
從輸出中,我們可以知道,0x82是作為補碼的形式存入的,並且輸出的也是-126的補碼,不是原碼!!

">>“和”>>>”的區別
">>為算術位移,即帶符號的位移,>>時高位補符號位,<<時低位補0,如下:"


這裡寫圖片描述
–5的原碼為:0x80000005,-5的補碼為0xFFFFFFFB,右移2為後補碼高位補1,移位後的補碼為0xFFFFFFFE,則移位後的原碼為0x80000002,輸出為-2!
這裡寫圖片描述
那麼-2<<2等於多少呢?結果為-8,並不是-5!
這裡寫圖片描述
輸出:-8!
因此,位移1位不能簡單的理解為乘以2或者除以2,就像-1右移1位還是等於-1一樣,應該理解移位運算的原理。
">>>"為邏輯位移,即不帶符號的位移,>>>時高位補0如下:
這裡寫圖片描述
當0xF0000000邏輯右移24位後,結果為0x000000F0,因此輸出為240!