移位運(yùn)算符操作的對(duì)象就是二進(jìn)制的位疚宇,可以單獨(dú)用移位運(yùn)算符來處理int型整數(shù)扒最。
有三種移位運(yùn)算符 (<<告嘲,>>错维,>>>)
1奖地,<< 左移運(yùn)算符,將運(yùn)算符左邊的對(duì)象向左移動(dòng)運(yùn)算符右邊指定的位數(shù)(在低位補(bǔ)0) x<<3
2赋焕,>> 有符號(hào)右移運(yùn)算符参歹,將運(yùn)算符左邊的對(duì)象向右移動(dòng)運(yùn)算符右邊指定的位數(shù)。使用符號(hào)擴(kuò)展機(jī)制宏邮,也就是說泽示,如果值為正,則在高位補(bǔ)0蜜氨,如果值為負(fù)械筛,則在高位補(bǔ)1. x>>3
3,>>> 無符號(hào)右移運(yùn)算符飒炎,將運(yùn)算符左邊的對(duì)象向右移動(dòng)運(yùn)算符右邊指定的位數(shù)埋哟。采用0擴(kuò)展機(jī)制,也就是說郎汪,無論值的正負(fù)赤赊,都在高位補(bǔ)0. x>>>3
因?yàn)橛?jì)算機(jī)中int是以補(bǔ)碼存儲(chǔ)的,所以實(shí)際運(yùn)行時(shí)是以補(bǔ)碼形式來進(jìn)行移位操作的
例如
10 的補(bǔ)碼為00000000 00000000 00000000 00001010(正數(shù)的反碼煞赢,補(bǔ)碼跟原碼相同)
00000000 00000000 00000000 00001010
10 << 2 00000000 00000000 00000000 00101000 左側(cè)舍棄2位抛计,右側(cè)補(bǔ)0 結(jié)果:40
10 >> 2 00000000 00000000 00000000 00000010 左側(cè)補(bǔ)2個(gè)0(正數(shù)),右側(cè)舍棄兩位 結(jié)果:2
10 >>>2 00000000 00000000 00000000 00000010 左側(cè)補(bǔ)2個(gè)0照筑,右側(cè)舍棄兩位 結(jié)果:2
-10的補(bǔ)碼為11111111 11111111 11111111 11110110
11111111 11111111 11111111 11110110
-10 << 2 11111111 11111111 11111111 11011000 左側(cè)舍棄2位吹截,右側(cè)補(bǔ)0 結(jié)果:-40
-10 >> 2 11111111 11111111 11111111 11111101 左側(cè)補(bǔ)2個(gè)1(負(fù)數(shù)),右側(cè)舍棄兩位 結(jié)果:-3
-10 >>>2 00111111 11111111 11111111 11111101 左側(cè)補(bǔ)2個(gè)0凝危,右側(cè)舍棄兩位 結(jié)果:1073741821
通過上邊的波俄,我們可以發(fā)現(xiàn)
在數(shù)字沒有溢出的前提下,對(duì)于正數(shù)和負(fù)數(shù)蛾默,左移一位都相當(dāng)于乘以2的1次方懦铺,左移n位就相當(dāng)于乘以2的n次方
10 << n = 10 * 2^n
對(duì)于正數(shù)右移,則相當(dāng)于除以2的n次方(取整) 10 >> n = 10/2^n
10 >> 2 相當(dāng)于 10 / 2^2 = 2
但對(duì)于負(fù)數(shù)的右移支鸡,就沒有什么算術(shù)意義
從計(jì)算速度上講冬念,移位運(yùn)算要比算術(shù)運(yùn)算快,所以我們可以在條件滿足情況下采用移位來代替乘除法
如果位移之后的數(shù)字已經(jīng)越界了牧挣,則就失去了代替乘除法的意義了
public class AA {
public static void main(String args[]) {
System.out.println("正數(shù)10位移");
System.out.println("10<<2 = " + (10 << 2));
System.out.println("10>>2 = " + (10 >> 2));
System.out.println("10>>>2 = " + (10 >>> 2));
System.out.println("-----------------------");
System.out.println("負(fù)數(shù)-10位移");
System.out.println("-10<<2 = " + (-10 << 2));
System.out.println("-10>>2 = " + (-10 >> 2));
System.out.println("-10>>>2 = " + (-10 >>> 2));
System.out.println("Integer.MAX_VALUE:"+Integer.MAX_VALUE);
System.out.println("1073741823 << 1 = "+ (1073741823 << 1));//1073741823左移一位相當(dāng)于乘2 得到結(jié)果為2147483646,未越界
System.out.println("1073741824 << 1 = "+ (1073741824 << 1));//1073741823左移一位相當(dāng)于乘2 得到結(jié)果為2147483648,越界
}
}
計(jì)算結(jié)果:
正數(shù)10位移
10<<2 = 40
10>>2 = 2
10>>>2 = 2
-----------------------
負(fù)數(shù)-10位移
-10<<2 = -40
-10>>2 = -3
-10>>>2 = 1073741821
Integer.MAX_VALUE:2147483647
1073741823 << 1 = 2147483646
1073741824 << 1 = -2147483648