左移和右移都是对整数的补码进行运算的
左移就是补码向左移两位,每左移一位就相当于补码所对应的十进制的整数 *2
右移就是补码向右移两位,每右移一位就相当于补码所对应的十进制的整数 \2
61补码:00..0 11 1101 (Java的整型默认类型为Int,int占32bit)
左移:00..0 0011 1101 << 00..0 0111 1010 << 00..0 1111 0100 (244)
右移:00..0 0011 1101 >> 00..0 0001 1110 >> 00..0 0000 1111 (15)
System.out.println((byte)(61<<2)); //-12
System.out.println(61<<2);//244
System.out.println(0b0011111111111111111111111111111111111111111111111111111111111111l<<2); //-4
System.out.println(-61>>>2); //1073741808
System.out.println(61>>>2); //15
1、3句都是溢出了,不能保持原来的正负
>>>是无符号右移,无符号右移右移后前面会补0,负数无符号右移后都会变为正数,正数的无符号右移和普通右移一样
只有无符号右移>>>
为什么没有无符号左移?
无符号左移没意义,因为无符号左移和带符号的左移一样都是左移后往后面补0