返回

java位运算符本质推算

后端

位运算符简介

位运算符是一种按位操作的运算符,它直接对二进制位进行操作。Java中常用的位运算符有:

  • 左移(<<):将操作数的二进制位向左移动指定位数,空出的低位补0。
  • 右移(>>):将操作数的二进制位向右移动指定位数,空出的高位补0(有符号右移)或1(无符号右移)。
  • 按位与(&):将两个操作数的二进制位逐位相与,结果为0或1。
  • 按位或(|):将两个操作数的二进制位逐位相或,结果为0或1。
  • 按位异或(^):将两个操作数的二进制位逐位相异或,结果为0或1。
  • 位反(~):将操作数的二进制位逐位取反,结果为0或1。

二进制的原码、反码和补码

在理解位运算符的工作原理之前,我们需要先了解二进制的原码、反码和补码。

  • 原码:原码是最简单的二进制表示形式,正数的原码就是其本身,负数的原码是在其绝对值的最高位加一个负号(-)。
  • 反码:反码是原码的按位取反,即把0变成1,把1变成0。
  • 补码:补码是反码加1,即把最低位的0变成1,把最高位的1变成0。

位运算符的推算过程

左移(<<)

左移运算符将操作数的二进制位向左移动指定位数,空出的低位补0。例如:

int a = 10; // 二进制为 0000 1010
a << 2; // 二进制为 0010 1000

在这个例子中,a的二进制位向左移动了2位,空出的低位补0,因此结果为0010 1000(十进制20)。

右移(>>)

右移运算符将操作数的二进制位向右移动指定位数,空出的高位补0(有符号右移)或1(无符号右移)。例如:

int a = 10; // 二进制为 0000 1010
a >> 2; // 二进制为 0000 0010(有符号右移)
a >>> 2; // 二进制为 0000 0010(无符号右移)

在这个例子中,a的二进制位向右移动了2位,有符号右移时,空出的高位补0,因此结果为0000 0010(十进制2);无符号右移时,空出的高位补1,因此结果也是0000 0010(十进制2)。

按位与(&)

按位与运算符将两个操作数的二进制位逐位相与,结果为0或1。例如:

int a = 10; // 二进制为 0000 1010
int b = 5; // 二进制为 0000 0101
a & b; // 二进制为 0000 0000

在这个例子中,a和b的二进制位逐位相与,结果为0000 0000(十进制0)。

按位或(|)

按位或运算符将两个操作数的二进制位逐位相或,结果为0或1。例如:

int a = 10; // 二进制为 0000 1010
int b = 5; // 二进制为 0000 0101
a | b; // 二进制为 0000 1111

在这个例子中,a和b的二进制位逐位相或,结果为0000 1111(十进制15)。

按位异或(^)

按位异或运算符将两个操作数的二进制位逐位相异或,结果为0或1。例如:

int a = 10; // 二进制为 0000 1010
int b = 5; // 二进制为 0000 0101
a ^ b; // 二进制为 0000 1111

在这个例子中,a和b的二进制位逐位相异或,结果为0000 1111(十进制15)。

位反(~)

位反运算符将操作数的二进制位逐位取反,结果为0或1。例如:

int a = 10; // 二进制为 0000 1010
~a; // 二进制为 1111 0101

在这个例子中,a的二进制位逐位取反,结果为1111 0101(十进制-11)。

结语

本文介绍了Java位运算符的原理和使用,希望对读者有所帮助。更多关于Java位运算符的知识,可以参考Java官方文档或其他相关资料。