移位運算子(和)
Java 語言提供了三個運算子,用於在 32 位和 64 位整數值上執行按位移位。這些都是二元運算子,第一個運算元是要移位的值,第二個運算元表示移位多遠。
-
<<
或左移位運算子將第一個運算元給定的值向左移動第二個運算元給出的位位置數。右端的空位置用零填充。 -
‘>>‘或算術移位運算子將第一個運算元給出的值向右移動第二個運算元給出的位位數。通過複製最左邊的位來填充左端的空位置。此過程稱為符號擴充套件。
-
‘>>>‘或邏輯右移位運算子將第一個運算元給出的值向右移動第二個運算元給出的位位置數。左端的空位置用零填充。
筆記:
-
這些運算子需要
int
或long
值作為第一個運算元,併產生與第一個運算元相同型別的值。 (在將轉換結果分配給byte
,short
或char
變數時,你需要使用顯式型別轉換。) -
如果你使用一個第一個運算元為
byte
,char
或short
的 shift 操作符,它將被提升為int
並且操作產生一個int
。) -
第二個運算元以操作*的位數為模,*以給出移位量。有關 mod 數學概念的更多資訊,請參見模數示例 。
-
通過操作從左端或右端移位的位被丟棄。 (Java 不提供原始的旋轉運算子。)
-
算術移位運算子等效於將(二進位制補碼)數除以 2 的冪。
-
左移運算子相當於將(二進位制補碼)數乘以 2 的冪。
下表將幫助你瞭解三個班次運算子的效果。 (這些數字用二進位制表示法表示,以幫助虛擬化。)
OPERAND1 | 運算元 | << |
>> |
>>> |
---|---|---|---|---|
0b0000000000001011 | 0 | 0b0000000000001011 | 0b0000000000001011 | 0b0000000000001011 |
0b0000000000001011 | 1 | 0b0000000000010110 | 0b0000000000000101 | 0b0000000000000101 |
0b0000000000001011 | 2 | 0b0000000000101100 | 0b0000000000000010 | 0b0000000000000010 |
0b0000000000001011 | 28 | 0b1011000000000000 | 0b0000000000000000 | 0b0000000000000000 |
0b0000000000001011 | 31 | 0b1000000000000000 | 0b0000000000000000 | 0b0000000000000000 |
0b0000000000001011 | 32 | 0b0000000000001011 | 0b0000000000001011 | 0b0000000000001011 |
… | … | … | … | … |
0b1000000000001011 | 0 | 0b1000000000001011 | 0b1000000000001011 | 0b1000000000001011 |
0b1000000000001011 | 1 | 0b0000000000010110 | 0b1100000000000101 | 0b0100000000000101 |
0b1000000000001011 | 2 | 0b0000000000101100 | 0b1110000000000010 | 0b00100000000000100 |
0b1000000000001011 | 31 | 0b1000000000000000 | 0b1111111111111111 | 0b0000000000000001 |
在 Bit 操作中有移位運算子的使用者的例子