1、上一篇文章记录了部分位运算符的基本用法1,下面继续总结>>
,>>>
,<<
的用法:
<<
左移,左边最高位丢弃,右边补齐0>>
右移,最高位是0左边补齐0,最高位是1左边补齐1>>>
无符号右移,无论最高位是0还是1,左边补齐0
2、<<
案例:
public static void main(String[] args){
System.out.println( 12 << 1 ); //24
System.out.println( 12 << 2 ); //48
}
总结:左移,向左移动几位就是乘以2的几次幂。
分析:首先获取12的二进制:00000000 00000000 00000000 00001100(正数补码和原码相同)
操作:将12的补码向左移动一位或两位:()
内的是移除去的
00000000 00000000 00000000 00001100 //12的补码
------------------------------------------------
<<1 (0)00000000 00000000 00000000 00011000 //24的补码
------------------------------------------------
<<2 (0)(0)00000000 00000000 00000000 00110000 //48的补码
3、>>
案例:
public static void main(String[] args){
System.out.println( 12 >> 1 ); //6
System.out.println( 12 >> 2 ); //3
}
总结:右移,向右移动几位就是除以2的几次幂。
操作:将12的补码向右移动一位或两位:()
内的是移除去的
00000000 00000000 00000000 00001100 //12的补码
----------------------------------------------
<<1 00000000 00000000 00000000 00000110 (0) //6的补码
----------------------------------------------
<<2 00000000 00000000 00000000 00000011 (0)(0) //3的补码
4、>>>
和>>
的区别:
有符号右移>>
,如果高位是1则左边会一直补1,最终会都变为1,而无符号右移>>>
无论最高位是0还是1,左边一直补0,最后会补到全为0。
5、有效率的算出2 * 8
的结果:
扫描二维码关注公众号,回复:
11415055 查看本文章
如果直接写2*8
,计算机底层是先将2
转为二进制,然后将8
转为二进制,然后再将他们相乘,其实这样的运算效率是很低的。
解决方法:
System.out.println( 2 << 3);
解释:因为8
是2
的三次方,向左移动三位也就是*2
的三次方,计算机底层会先将2
转换为二进制,然后向左移动三位,直接操作的是二进制,一定比2*8
效率高。