Java 位运算符
本教程介绍 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 编程不支持无符号左移运算符(用 <<<
表示),因为 <<
和 <<<
是相同的操作。