Java 位運算子
![Java 位運算子](/img/Java/java-bitwise-operators---or-conversion.webp)
本教程介紹 Java 中的位運算子。我們將通過程式碼示例和數學解釋瞭解按位 OR
、AND
、XOR
、補碼和移位運算子。
Java 位運算子
考慮到 Java 程式設計,運算子用於執行指定的操作。位運算子在位上工作並單獨操作(逐位)。
位運算子可以與 int
、short
和 char
一起使用。當我們執行更新或想要查詢二叉索引樹的運算子時,我們可以使用按位運算子。
下面列出了不同型別的按位運算子。
- 按位
OR
,符號表示為|
。 - 按位
AND
,符號表示為&
。 - 按位
XOR
,在程式碼中表示為^
。 - 按位補碼,用
~
表示。 - 移位運算子:
5.1 有符號右移,表示為>>
。
5.2 有符號左移,表示為<<
。
5.3 無符號右移,用>>>
表示。
5.4 用<<<
表示的無符號左移。
讓我們一一學習。
Java 中的按位 OR
運算子
OR
是用管道符號|
表示的二元運算子。它也被稱為包容性 OR
。
OR
運算子如果找到至少一個運算元為 1,則返回 1;否則為 0。以下是兩個運算元 X
和 Y
的真值表,我們可以使用它來理解按位 OR
運算子。
X | Y | X | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
在瞭解了真值表之後,我們可以很容易地將其轉換成下面給出的 Java 程式。
public class BitwiseOr {
public static void main(String[] args) {
int x = 8, y = 9;
System.out.println("x | y = " + (x | y));
}
}
輸出:
x | y = 9
這個程式背後發生了什麼?這裡,數字 8 和 9 先轉換為位,分別為 1000 和 1001。
他們的 OR
等於 1001,即 9。如何?請參閱以下內容。
Java 中的按位 AND
運算子
這個二元運算子用 &
表示,如果兩個位都為 1,則返回 1;否則,它返回 0。下面的真值表演示了 AND
運算子,其中 X
和 Y
是兩個運算元並且只接受二進位制值(1 或 0)。
X | Y | X & Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
現在,我們可以將這個真值表轉換為 Java 程式碼。
public class BitwiseAnd {
public static void main(String[] args) {
int x = 8, y = 9;
System.out.println("x & y = " + (x & y));
}
}
輸出:
x & y = 8
以下是在上面給出的 Java 程式後面執行的每個步驟的視覺化解釋。
Java 中的按位 XOR
運算子
二進位制 XOR
運算子(也稱為異或 OR
)用符號^
表示,如果兩個位不同,則返回 1。如果運算元 X
為 1,且 Y
為 0,或者 Y
為 1,且 X
為 0,我們得到 1。
如果兩者都是 1 或 0,我們得到的結果為 0。不要混淆;看下面的真值表來理解它。
X | Y | X ^ Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
我們可以將它翻譯成 Java 程式如下。
public class BitwiseXor {
public static void main(String[] args) {
int x = 8, y = 9;
System.out.println("x ^ y = " + (x ^ y));
}
}
輸出:
x ^ y = 1
讓我們從下面的步驟截圖中瞭解它是如何工作的。
Java 中的位補運算子
這個二元運算子是一元運算子,用 ~
表示,發音為波浪號。補碼運算子通過將每一位從 0 翻轉到 1 和從 1 翻轉到 0 來返回逆運算。
我們也可以說它返回一個補碼,因為它使每一位從 1 到 0 和從 0 到 1。檢查以下真值表。
X | ~X |
---|---|
0 | 1 |
1 | 0 |
上真值表的 Java 程式如下。
public class BitwiseComplement {
public static void main(String[] args) {
int x = 8;
System.out.println("~x= " + (~x));
}
}
輸出:
~x= -9
請記住,N
的補碼總是等於 -(N+1)
。這裡 N
是輸入值,這裡是 8。
所以,補碼是 -(8+1) = -9
。現在,讓我們通過數學工作來理解它,以確認我們是否能得到正確的結果。
看,我們無法找出預期的結果。為什麼?因為我們不允許將答案直接轉換成小數。
請記住,(-9) 的 2 的補碼等價於 8 的 1 的補碼。因此,我們可以說~N = - (N+1)
。
讓我們在下面的數學解釋中一起證明它。
Java 中的按位移位運算子
我們使用 Java 中的按位移位運算子將位向右或向左移動給定的數字。讓我們練習它們中的每一個。
Java 中的有符號右移運算子
有符號右移也稱為按位右移運算子,用 >>
表示,並將位模式向右移動特定數量的位。最右邊的位被丟棄,最左邊的位置用符號位填充。
這種移位使最左邊的一些空位用零填充(因為在這個例子中我們沒有任何符號位將其表示為正數)。下面給出這個例子的數學解釋。
讓我們將它與我們通過執行以下程式和下面的公式獲得的輸出進行比較。
$$
Variable « n = \frac {Variable} {2^n}
$$
示例程式碼:
public class BitwiseSignedRightShift {
public static void main(String[] args) {
int x = 10;
System.out.println("10 >> 1 = " + (x >> 1));
}
}
輸出:
10 >> 1 = 5
看,我們在所有方面都得到了輸出 5,這意味著我們做得對。
Java 中的有符號左移運算子
它也被稱為按位左移運算子,用 <<
表示,它將特定的位模式向左移動給定數量的位,並用 0 填充空位。
在繼續程式碼示例之前,讓我們瞭解它是如何使用 8 位
表示的。
正如你在上面的解釋中看到的,我們使用 8 位
表示將數字 10 轉換為二進位制形式。然後,丟棄最左邊的一位,將所有位向左移動 1 位,使最右邊的位為空,用 0 填充。
請記住,我們不會用丟棄的位填充空位。我們也可以使用下面給出的公式快速找到答案。
$$
Variable « n = Variable \cdot 2^n
$$
讓我們用下面給出的程式碼示例來做,你也可以使用上面給出的公式來確認輸出。
public class BitwiseSignedLeftShift {
public static void main(String[] args) {
int x = 10;
System.out.println("10 << 1 = " + (x << 1));
}
}
輸出:
10 << 1 = 20
Java 中的無符號右移運算子
它將位向右移動給定數量的位,但不佔用符號位來填充尾隨位置。它用 >>>
表示,並用 0 包裝尾隨位置。
請參閱以下程式碼示例。
public class BitwiseUnsignedRightShift {
public static void main(String[] args) {
int x = 40;
System.out.println("40 >>> 2 = " + (x >>> 2));
}
}
輸出:
40 >>> 2 = 10
Java 中的無符號左移運算子
Java 程式設計不支援無符號左移運算子(用 <<<
表示),因為 <<
和 <<<
是相同的操作。