java中的移位運(yùn)算符<< >>

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 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容