1、上一篇文章記錄了部分位運算符的基本用法1,下面繼續總結>>
,>>>
,<<
的用法:
<<
左移,左邊最高位丟棄,右邊補齊0>>
右移,最高位是0左邊補齊0,最高位是1左邊補齊1>>>
無符號右移,無論最高位是0還是1,左邊補齊0
2、<<
案例:
public static void main(String[] args){
System.out.println( 12 << 1 ); //24
System.out.println( 12 << 2 ); //48
}
總結:左移,向左移動幾位就是乘以2的幾次冪。
分析:首先獲取12的二進制:00000000 00000000 00000000 00001100(正數補碼和原碼相同)
操作:將12的補碼向左移動一位或兩位:()
內的是移除去的
00000000 00000000 00000000 00001100 //12的補碼
------------------------------------------------
<<1 (0)00000000 00000000 00000000 00011000 //24的補碼
------------------------------------------------
<<2 (0)(0)00000000 00000000 00000000 00110000 //48的補碼
3、>>
案例:
public static void main(String[] args){
System.out.println( 12 >> 1 ); //6
System.out.println( 12 >> 2 ); //3
}
總結:右移,向右移動幾位就是除以2的幾次冪。
操作:將12的補碼向右移動一位或兩位:()
內的是移除去的
00000000 00000000 00000000 00001100 //12的補碼
----------------------------------------------
<<1 00000000 00000000 00000000 00000110 (0) //6的補碼
----------------------------------------------
<<2 00000000 00000000 00000000 00000011 (0)(0) //3的補碼
4、>>>
和>>
的區別:
有符號右移>>
,如果高位是1則左邊會一直補1,最終會都變爲1,而無符號右移>>>
無論最高位是0還是1,左邊一直補0,最後會補到全爲0。
5、有效率的算出2 * 8
的結果:
如果直接寫2*8
,計算機底層是先將2
轉爲二進制,然後將8
轉爲二進制,然後再將他們相乘,其實這樣的運算效率是很低的。
解決方法:
System.out.println( 2 << 3);
解釋:因爲8
是2
的三次方,向左移動三位也就是*2
的三次方,計算機底層會先將2
轉換爲二進制,然後向左移動三位,直接操作的是二進制,一定比2*8
效率高。