提示1:左移几次,就乘上几次2;右移几次,就除去几次2。
提示2:负数要用补码来进行运算,要先对其补码进行移动,最后再将补码变为原码,即得到结果。
>>在移动过程中其符号位保持不变!
>>>在移动过程中其符号位可以改变!
package Java2022_6_21;
public class BitOperater {
public static void main(String[] args) {
// >>2 向右移动2位
// <<2 向左移动2位
// >>>2 无符号右移2位
int i = 4>>2; // 4/2/2 = 1
System.out.println(i);
/*
00000000 00000000 00000000 00000100
向右移动2位:
00000000 00000000 00000000 00000001
结果为1
*/
int y = 4<<2; // 4*2*2 = 16
System.out.println(y);
int z = 4<<2; // 4*2*2 = 16
System.out.println(z);
int k = 8<<3; // 8*2*2*2 = 64
System.out.println(k);
/*
* 00000000 00000000 00000000 00001000
* 向左移动3位
* 00000000 00000000 00000000 01000000
* 结果为64
* */
//负数要用补码来进行运算,要先对其补码进行移动,最后再将补码变为原码,即得到结果.
//在移动过程中其符号位保持不变
int l = -4<<2; //(-4)*2*2 = -16
System.out.println(l);
/*
* -4的原码 10000000 00000000 00000000 00000100
* -4的反码 11111111 11111111 11111111 11111011
* 补码=反码+1 11111111 11111111 11111111 11111100
* 补码左移2位: 11111111 11111111 11111111 11110000
*
* 最后将补码变为原码(步骤:补码减1,然后取反)
* 11111111 11111111 11111111 11101111
* 10000000 00000000 00000000 00010000
* 结果为-16
* */
int m = -4>>2; //(-4)/2/2 = -1
System.out.println(m);
/*
* -4的补码 11111111 11111111 11111111 11111100
* 补码右移2位 10111111 11111111 11111111 11111111
* 最后将补码变为原码(步骤:补码减1,然后取反)
* 10111111 11111111 11111111 11111110
* 10000000 00000000 00000000 00000001
* 结果为-1
* */
//无符号右移
int n = -4>>>2; //结果为:1073741823
System.out.println(n);
/*
* -4的补码 11111111 11111111 11111111 11111100
* 无符号右移2位 00111111 11111111 11111111 11111111
* 此时已经是正数,正数的补码就是其本身,即为原码:
* 00111111 11111111 11111111 11111111
* */
}
}
验证: