在java中,左移 ( <<
) 和右移 ( >>
) 是位运算符,用于对二进制数进行移位操作。移位操作会对数字的位模式进行直接操作。
1. 左移运算符(<<)
功能:
- 左移操作会将一个数字的二进制位向左移动指定的位数,右边用 0 填充。
- 每向左移动一位,相当于该数字乘以2(但不是严格意义上的乘法,可能会导致溢出)。
语法:
result = value << n;
value
是要操作的数字。n
是移动的位数。
特点:
- 左移后会扩大数字的值(如果没有溢出的话)。
- 右边补0。
- 如果是负数,二进制会以补码形式参与计算。
示例:
int a = 5; // 二进制:00000000 00000000 00000000 00000101 int result = a << 2; // 左移2位:00000000 00000000 00000000 00010100(20) system.out.println(result); // 输出:20
2. 右移运算符(>>)
功能:
- 右移操作会将一个数字的二进制位向右移动指定的位数。
- 符号位扩展:如果是正数,高位用0填充;如果是负数,高位用1填充(即符号位保持不变)。
- 每向右移动一位,相当于该数字除以2(向下取整)。
语法:
result = value >> n;
value
是要操作的数字。n
是移动的位数。
特点:
- 对于正数,右移后高位用0填充。
- 对于负数,右移后高位用1填充(符号位扩展)。
- 适合处理带符号的数字。
示例:
int a = 20; // 二进制:00000000 00000000 00000000 00010100 int result = a >> 2; // 右移2位:00000000 00000000 00000000 00000101(5) system.out.println(result); // 输出:5 int b = -20; // 二进制:11111111 11111111 11111111 11101100(补码表示) int result2 = b >> 2; // 右移2位:11111111 11111111 11111111 11111011(-5) system.out.println(result2); // 输出:-5
3. 无符号右移运算符(>>>)
除了 >>
,java 还提供了 无符号右移运算符 >>>
:
- 无论正数还是负数,高位都用 0 填充。
- 通常用于操作无符号数据。
示例:
int a = -20; // 二进制:11111111 11111111 11111111 11101100(补码表示) int result = a >>> 2; // 无符号右移2位:00111111 11111111 11111111 11111011 system.out.println(result); // 输出:1073741819
总结
操作符 | 名称 | 功能 |
---|---|---|
<< | 左移 | 二进制向左移,右边补0,相当于乘以2的n次方(如果不溢出)。 |
>> | 符号右移 | 二进制向右移,保留符号位,高位补符号位(正数补0,负数补1),相当于除以2的n次方。 |
>>> | 无符号右移 | 二进制向右移,高位总是补0,不考虑符号位。 |
扩展:i <<= j
- 在java中,
i <<= j
是一个复合运算符,它等价于i = i << j
,表示将i
的二进制位向左移动j
位,然后将结果赋值给i
。即将i
左移j位,相当于i
乘以2
的j
次方。
运算过程
i
的二进制形式会向左移动j
位。- 移位后,低位用 0 补充,高位可能会溢出(超出当前数据类型范围的部分会被丢弃)。
- 最终结果存回变量
i
。
示例
示例1:对正数进行左移
public class main { public static void main(string[] args) { int i = 5; // 二进制:00000000 00000000 00000000 00000101 int j = 2; i <<= j; // 等价于 i = i << j // 左移2位:00000000 00000000 00000000 00010100 (20) system.out.println(i); // 输出:20 } }
示例2:对负数进行左移
public class main { public static void main(string[] args) { int i = -5; // 二进制(补码):11111111 11111111 11111111 11111011 int j = 2; i <<= j; // 等价于 i = i << j // 左移2位:11111111 11111111 11111111 11101100 (-20) system.out.println(i); // 输出:-20 } }
示例3:可能的溢出问题
public class main { public static void main(string[] args) { int i = 1073741824; // 二进制:01000000 00000000 00000000 00000000 int j = 1; i <<= j; // 左移1位:10000000 00000000 00000000 00000000 // 超过32位,结果变为负数(溢出) system.out.println(i); // 输出:-2147483648 } }
注意点
左移等价于乘以2的幂:
- 每向左移1位,相当于乘以
2
。 - 例如:
5 <<= 1
等价于5 * 2 = 10
,5 <<= 2
等价于5 * 4 = 20
。 - 注意,左移不会检查溢出问题,可能导致负数或错误的结果。
- 每向左移1位,相当于乘以
溢出问题:
- 移位可能会导致高位被截断,特别是当操作数接近数据类型的最大值时。
适用数据类型:
- 左移操作支持整型和长整型(
int
和long
)。 - 如果操作的类型小于
int
(比如byte
或short
),会被提升为int
再执行移位运算。
- 左移操作支持整型和长整型(
总结
到此这篇关于java左移、右移操作的文章就介绍到这了,更多相关java左移、右移操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论