移位运算符是 Java 中的一种位运算符,用于将数字的二进制位向左或向右移动。它们直接作用于二进制数据,常用于快速算术运算和底层位操作。
Java 提供了以下三种移位运算符:
1. 有符号左移运算符 (<<)
左移运算符将数字的位向左移动指定的位置。在右侧补零。
#### 语法:
> left_operand << number
class GFG {
public static void main(String[] args) {
byte a = 64, b;
int i;
i = a << 2;
b = (byte) (a << 2);
System.out.println("Original value of a: " + a);
System.out.println("i and b: " + i + " " + b);
}
}
Output
Original value of a: 64
i and b: 256 0
说明:
- a << 2 将 a 的位向左移动两个位置,实际上相当于将其乘以 4。
- 结果存储在 int 类型的变量 i 中,保留了完整的值。
- 当同一个结果被强制转换为 byte 并存储在 b 中时,由于 byte 的范围有限,发生了溢出。
- 输出结果突出了将位移操作存入 int 与强制转换回 byte 之间的区别。
2. 有符号右移运算符 (>>)
右移运算符将位向右移动。符号位(最高有效位 MSB)会被复制填充到空出的位置,从而保持数字的正负号不变。
#### 语法:
> left_operand >> number
class GFG {
public static void main(String[] args) {
int number = 8;
int ans = number >> 2;
System.out.println(ans);
}
}
Output
2
说明:
- number >> 2 将 number 的位向右移动两个位置。
- 右移操作会丢弃最低的两位,并用符号位填充左侧。
- 对于 8(二进制 1000),向右移动 2 位的结果是 2(二进制 0010),并将其打印出来。
class GFG {
public static void main(String[] args) {
char hex[] = {
‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,
‘8‘,‘9‘,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
Output
b = 0xf1
说明:
- hex 数组存储了十六进制字符(0–f)。
- byte 变量 b 被赋值为一个十六进制值(0xf1)。
- (b >> 4) & 0x0f 提取高 4 位,b & 0x0f 提取低 4 位。
- 这些值被用作 hex 数组的索引,以十六进制格式打印该字节。
3. 无符号右移运算符 (>>>)
无符号右移运算符将位向右移动,无论数字的符号如何,左侧空出的位都用 0 填充。
#### 语法:
> left_operand >>> number
class GFG {
public static void main(String[] args) {
byte num1 = 8;
byte num2 = -8;
System.out.println(num1 >>> 2);
System.out.println(num2 >>> 2);
}
}
Output
2
1073741822
说明:
- 对于正数,>> 和 >>> 的行为是相同的。
- 对于负数,>>> 在左侧填充 0,从而产生一个巨大的正数值。
4. Java 中的无符号左移运算符
Java 没有提供无符号左移运算符(<<<),原因是:
- 左移操作(<<)总是插入 0 位。
- 在 Java 中,逻辑左移和算术左移是完全相同的。
相关文章
> – Java 中的位运算符
> – Java 中的运算符
> – Java 数字转换程序