在Think in Java中有這么一段話“對(duì)char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會(huì)自動(dòng)轉(zhuǎn)換成一個(gè)int。只有右側(cè)的5個(gè)低位才會(huì)有用。這樣可防止我們?cè)谝粋€(gè)int數(shù)里移動(dòng)不切實(shí)際的位數(shù)。若對(duì)一個(gè)long值進(jìn)行處理,最后得到的結(jié)果也是long。此時(shí)只會(huì)用到右側(cè)的6個(gè)低位,防止移動(dòng)超過(guò)long值里現(xiàn)成的位數(shù)。”
對(duì)上面那段話的理解是:移位操作符操作的運(yùn)算對(duì)象是二進(jìn)制的“位”,int類型是32位也就是2的5次冪 !如果移32位以上,那么原來(lái)的數(shù)的信息會(huì)全部丟失,這樣也就沒(méi)有什么意義了!所以上面的“只有右側(cè)的5個(gè)低位才會(huì)有用”說(shuō)的是:移位操作符右端的那個(gè)數(shù)(化成二進(jìn)制)的低5位才有用,即
X < <y;
是指y的低5位才有用,即不能大于32。 而對(duì)于long型也是同樣的道理!
因此,如果對(duì)一個(gè)int 型,進(jìn)行移位,X < <y; 當(dāng)y小于32時(shí),移位后的結(jié)果一般都在我們的預(yù)料當(dāng)中;而如果y大于32時(shí),由于移位超出了int所能表示的范圍,這時(shí)就先把y化成二進(jìn)制數(shù),然后取該二進(jìn)制數(shù)右端的低5位,再把這5位化成十進(jìn)制,此時(shí)的這個(gè)十進(jìn)制就是要對(duì)X移動(dòng)的位數(shù)。
例如: int int a=140;
a << 34
System.out.println(Integer.toBinaryString(a << b));
上面那兩個(gè)語(yǔ)句的執(zhí)行過(guò)程是:先把a(bǔ)化成二進(jìn)制數(shù):10001100
執(zhí)行語(yǔ)句 a << 34 對(duì)a左移32位時(shí),先把 34化成二進(jìn)制:100010,對(duì)該二進(jìn)制數(shù)取右邊5位,即00010,化成十進(jìn)制數(shù)為2,所以實(shí)際上是對(duì)a左移兩位?,F(xiàn)在,地球人都會(huì)知道上面程序的輸出結(jié)果是:1000110000
聯(lián)系客服