Java 提供了運算子,可用來操作整數型別(byte、short、int、long 或 char)的位元。
使用 << 將位元向左移位,用 >> 向右移位。
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
>> 也稱為有號移位或算術移位運算子,因為它插入的位元與其正負號位元相同。
這是最高位位元,值為正時是 0,為負時是 1。
用 << 向左移位時,一律在右側插入 0。
// Shift 2 places to the right preserves the sign
// The binary value is two's complement of 0b0000_0110 (or 0x00000026), so the binary representation will be
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
向右移位時若要插入 0,請改用 >>>。
移位時插入 0 也稱為邏輯移位。
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
位元 AND 運算子(&)接收兩個值,並對每個位元執行 AND 運算。
它會比較第一個值的每個位元,以及第二個值中相同位置的位元。
如果兩者都是 1,結果的位元就是 1。
否則,結果的位元為 0。
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
位元 OR 運算子(|)接收兩個值,並對每個位元執行 OR 運算。
它會比較第一個值的每個位元,以及第二個值中相同位置的位元。
只要其中一個位元是 1,結果的位元就是 1。
否則為 0。
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
位元 XOR 運算子(^)會對兩個值執行位元 XOR 運算。
和位元 AND 與位元 OR 運算子一樣,它會比較第一個值的每個位元,以及第二個值中相同位置的位元。
如果只有其中一個是 1,結果的位元就是 1。
否則為 0。
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)最後,位元 NOT 運算子(~)會翻轉每個位元。
和先前的運算子不同,這是一元運算子,只作用於一個值。
~0b0110_0101;
// # => 0b1001_1010