>>
带符号右移,高位根据数据正负,正补0,负补1/**
* 带符号右移
**/
// num = 5 = 00000000 00000000 00000000 00000101
// num >> 1 = 00000000 00000000 00000000 00000010
System.out.println(num >> 1);
// num2 = -5 = 原码 10000000 00000000 00000000 00000101
// 反码 11111111 11111111 11111111 11111010
// 补码 11111111 11111111 11111111 11111011
// num2 >> 1 = 补码 11111111 11111111 11111111 11111101
// 原码 10000000 00000000 00000000 00000011 (非符号位取反+1)
// 因此:num2 >> 1 = -3
System.out.println(num2 >> 1 );
>>>
无符号右移,高位补0/**
* 无符号右移
**/
// num = 5 = 00000000 00000000 00000000 00000101
// num >> 1 = 00000000 00000000 00000000 00000010
System.out.println(num >>> 1);
// num2 = -5 = 原码 10000000 00000000 00000000 00000101
// 反码 11111111 11111111 11111111 11111010
// 补码 11111111 11111111 11111111 11111011
// num2 >> 1 = 补码 01111111 11111111 11111111 11111101
// num2 = 2147483645
System.out.println(num2 >>> 1);
int num = 1;
num << 1; // 相当于1 * 2,可以用于提高乘法效率
/**
* 左移
*/
// num2 = 5 = 00000000 00000000 00000000 00000101
// num2 << 1 = 00000000 00000000 00000000 00001010
// num2 = 10
System.out.println(num2 << 1);
// num2 = -5 = 原码 10000000 00000000 00000000 00000101
// 反码 11111111 11111111 11111111 11111010
// 补码 11111111 11111111 11111111 11111001
// num2 = 补码 11111111 11111111 11111111 11110110
// num2 = 原码 10000000 00000000 00000000 00001010 = -10
System.out.println(num << 1);