Java 中的位运算符主要用于对整数值的二进制表示(比特位)执行直接操作。不同于处理整个数值,这些运算符能够逐位地处理数据,从而实现快速且高效的底层运算。
- 位运算符仅适用于整数类型的数据,如 byte、short、int、long 和 char。
- 它们常用于性能优化、系统编程以及竞技编程中。
什么是位运算符?
位运算符会根据指定的运算规则,单独处理数字中的每一个比特位。当执行位运算时,操作数的对应位会被评估并组合,从而生成结果。
下面是 Java 中可用的主要位运算符:
描述
—
按位与
按位异或
按位取反 (NOT)
左移
有符号右移
无符号右移现在,让我们深入了解 Java 中的每一个位运算符:
1. 按位与 (&)
这是一个二元运算符,用 ‘&‘ 表示。它返回输入值的逐位与结果。也就是说,如果两个位都是 1,结果为 1,否则为 0。
#### 示例:
> a = 5 = 0101 (二进制)
> b = 7 = 0111 (二进制)
>
> 5 和 7 的按位与运算
> 0101
> & 0111
>
> 0101 = 5 (十进制)
2. 按位或 (|)
这是一个二元运算符,用 ‘|‘ 表示。它返回输入值的逐位或结果。也就是说,如果任意一个位是 1,结果为 1,否则为 0。
#### 示例:
> a = 5 = 0101 (二进制)
> b = 7 = 0111 (二进制)
>
> 5 和 7 的按位或运算
> 0101
> | 0111
>
> 0111 = 7 (十进制)
3. 按位异或 (^)
这是一个二元运算符,用 ‘^‘ 表示。它返回输入值的逐位异或结果。也就是说,如果对应的位不同,结果为 1,否则为 0。
#### 示例:
> a = 5 = 0101 (二进制)
> b = 7 = 0111 (二进制)
>
> 5 和 7 的按位异或运算
> 0101
> ^ 0111
>
> 0010 = 2 (十进制)
4. 按位取反 (~)
这是一个一元运算符,用 ‘~‘ 表示。它返回输入值的一进制补码表示,即将所有位反转,这意味着它把每个 0 变成 1,每个 1 变成 0。
#### 示例:
> a = 5 = 0101 (二进制)
>
> Java 中 5 的按位取反运算 (8 bit)
>
> ~ 00000101
>
> 11111010 = -6 (十进制)
解释: 5 的按位取反结果是 11111010,这在二进制补码格式中表示 -6。N 的二进制补码是 ~N + 1,所以 ~5 的结果是 -6。
Java 中按位取反运算符的“玄机”
5 的按位取反是 246,而 246 的二进制补码是 -6。因此,输出结果是 -6 而不是 246。
> N 的按位取反 = ~N (以二进制补码形式表示)
> ~N 的二进制补码 = -(~(~N)+1) = -(N+1)。
例如: 一个数的二进制补码等于该数的补码 + 1 。
!Bitwise complement2‘s Complement
演示: 这里是一个展示所有位运算符的 Java 程序。
Java
CODEBLOCK_5116a3c9
Output
a&b = 5
a|b = 7
a^b = 2
~a = -6
a= 5
带有二进制输出的位运算符
示例: 这是一个使用二进制字符串展示位运算的 Java 程序。
Java
`
class Geeks {
public static void main (String[] args) {
String binary[]={
"0000","0001","0010","0011","0100","0101",
"0110","0111","1000","1001","1010",
"1011","1100","1101","1110","1111"
};
// initializing the values of a and b
int a=3; // 0+2+1 or 0011 in binary
int b=6; // 4+2+0 or 0110 in binary
// bitwise or
int c= a | b;
// bitwise and
int d= a & b;
// bitwise xor
int e= a ^ b;
// bitwise not
int f= (~a & b)|(a &~b);
int g= ~a &