1. <<:左移運(yùn)算符:把一個(gè)數(shù)的所有位都向左移動(dòng)若干位,簡(jiǎn)單來說就是:i << j = i * 2^j
- 2<<1=4
2的二進(jìn)制為:00000010 ,向左移動(dòng)1位變成:00000100,即4,相當(dāng)于2*2^1=4
- 3<<3=24
3的二進(jìn)制為:00000110 ,向左移動(dòng)3位變成:0011000,即24,相當(dāng)于3*2^3=24
注意:左移里一個(gè)比較特殊的情況是當(dāng)左移的位數(shù)超過該數(shù)值類型的最大位數(shù)時(shí),編譯器會(huì)用左移的位數(shù)去模類型的最大位數(shù),然后按余數(shù)進(jìn)行移位
總之:左移就是:丟棄最高位,0補(bǔ)最低位
2. >>:右移運(yùn)算符,右移的概念和左移相反,就是往右邊挪動(dòng)若干位
- 2>>1=1
2的二進(jìn)制為:00000010 ,向右移動(dòng)1位變成:00000001,即1,相當(dāng)于2/2^1=1
- 3>>3=0
3的二進(jìn)制為:00000110 ,向右移動(dòng)3位變成:00000000,即0,移位不夠,舍棄為0
- 4>>2=1
4的二進(jìn)制為:00000100 ,向右移動(dòng)2位變成:00000001,即1,相當(dāng)于2/2^2=1
注意:當(dāng)移動(dòng)的位數(shù)超過類型的長(zhǎng)度時(shí),會(huì)取余數(shù),然后移動(dòng)余數(shù)個(gè)位
總之:左移是邏輯/算術(shù)左移(兩者完全相同),右移是算術(shù)右移,會(huì)保持符號(hào)位不變.實(shí)際應(yīng)用中可以根據(jù)情況用左/右移做快速的乘/除運(yùn)算,這樣會(huì)比循環(huán)效率高很多.
例:C語言中左移<<表示乘以2,右移>>表示除以2,這是由計(jì)算機(jī)工作原理導(dǎo)致的!但是要是7,二進(jìn)制數(shù)為0111,右移一位得3.5,但是右移之后二進(jìn)制數(shù)變成0011,是3。不一樣啊,怎么解釋呢?
移位操作符的兩個(gè)操作數(shù)必須是整型的。整個(gè)移位表達(dá)式的值的類型也是整型的,而且,左移位操作符與右移位操作符的運(yùn)算并不對(duì)稱。0111右移一位是把最后一位的1去掉,左邊補(bǔ)個(gè)0,得0011,轉(zhuǎn)換為十進(jìn)制是3,這是正確的。并不等同于除以2 。