移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:
(1)<< : (left-shift), 最低位補0
(2)>> : (signed right-shift), 右移過程使用符號位擴展(sign extension),即如果符號為為1則高位補1,? 是0則補0,也就是邏輯右移
(3)>>> : (unsigned right-shit),右移過程使用零擴展(zero extension),即最高位一律補0,也就是算術右移
(4)
移位操作的數據類型可以是byte, char, short, int, long型,但是對byte, char,
short進行操作時會先把它們變成一個int型,最后得到一個int型的結果,對long型操作時得到一個long型結果,不可以對boolean型進
行操作。
(5)移位操作符可以和=合并起來,即 <<= 、 >>= 和 >>>=。例如 a
>>= 2; 表示將a右移兩位后的值重新賦給a。當時在使用這三個操作符對 byte, char,
short型數據進行操作時要注意,例如有一下代碼片段:
public?class?ShiftTest
{
????public?static?void?main(String?[]?args)
????{
????????byte?a;
????????byte?b;
????????byte?c;
????????a?=?127;
????????b?=?127;
????????c?=?127;
????????a?<<=?2;
????????System.out.println(a);
????????System.out.println(b?<<=?2);
????????System.out.println(c?<<?2);
????}
}
????
運行結果是:
??? ??? ??? -4
??? ?? ?? ? -4
??? ?? ?? ?? 508
這
說明了在操作a <<= 2 執行過程是這樣的:先將 byte型的數 127變成int型,左移2位得到
508,然后把508賦給byte型變量a時只是簡單地"折斷"(truncate)得到數-4。編譯時編譯器不會提示你可能損失精度(實際上在本例中確
實是損失精度了),但是如果你把a <<= 2改成 a = a << 2;編譯器就會提示可能損失精度了。