移位運算子(和)

Java 語言提供了三個運算子,用於在 32 位和 64 位整數值上執行按位移位。這些都是二元運算子,第一個運算元是要移位的值,第二個運算元表示移位多遠。

  • <<左移位運算子將第一個運算元給定的值向左移動第二個運算元給出的位位置數。右端的空位置用零填充。

  • ‘>>‘或算術移位運算子將第一個運算元給出的值向右移動第二個運算元給出的位位數。通過複製最左邊的位來填充左端的空位置。此過程稱為符號擴充套件

  • ‘>>>‘或邏輯右移位運算子將第一個運算元給出的值向右移動第二個運算元給出的位位置數。左端的空位置用零填充。

筆記:

  1. 這些運算子需要 intlong 值作為第一個運算元,併產生與第一個運算元相同型別的值。 (在將轉換結果分配給 byteshortchar 變數時,你需要使用顯式型別轉換。)

  2. 如果你使用一個第一個運算元為 bytecharshort 的 shift 操作符,它將被提升為 int 並且操作產生一個 int。)

  3. 第二個運算元以操作*的位數為模,*以給出移位量。有關 mod 數學概念的更多資訊,請參見模數示例

  4. 通過操作從左端或右端移位的位被丟棄。 (Java 不提供原始的旋轉運算子。)

  5. 算術移位運算子等效於將(二進位制補碼)數除以 2 的冪。

  6. 左移運算子相當於將(二進位制補碼)數乘以 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 操作中有移位運算子的使用者的例子