Posts /

移位运算

03 Apr 2020

移位运算


»> 、» 、«

>>带符号右移,高位根据数据正负,正补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);