Java运算符值之位运算符

Java运算符值之位运算符

Java支持的位运算符有七个:

  1. &:按位与。当两位同为1时才返回1 。
  2. |:按位或。只要有一位为1即可返回1。
  3. ~:按位非。单目运算符,将操作数的每个位(包括符号位)全部取反。
  4. ^:按位异或。当两位相同时返回0,不同时返回1 。
  5. <<:左移运算符。
  6. ‘>>’ :右移运算符。
  7. ‘>>>’ :无符号右移运算符。

注意:位运算符计算时都是以补码进行计算的。正数的补码是其原码,负数的补码是其反码加1,其反码是其原码除符号位外都取反。如下代码为例:

System.out.println(~ -5);//输出4
System.out.println(5 ^ 9);//输出12

重点讲三个:左移运算符,右移运算符,无符号右移运算符。

1.左移运算符是将操作数的二进制码整体左移指定位数。左移后右边空出来的位以0填充。如下代码为例:

System.out.println(5 << 2);//将输出20
System.out.println(-5 << 2);//将输出-20

2.右移运算符有两个:>> 和 >>>,对于>>运算符而言,把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号填充。即如果第一位操作数原来是正数,则左边补0;如果第一位操作数是负数,则左边补1。>>>是无符号右移运算符,它把第一位操作数的二进制码右移指定位数后,左边空出来的位总是以0填充。

System.out.println(-5 >> 2);//将输出-2
System.out.rintln(-5 >>> 2);//将输出1073741822

进行移位运算符是还要遵循如下规则:
1.对于低于int类型(byte、short 和 char)的操作数总是先自动类型转换为int类型后再移位。
2.对于int类型的整数移位a >> b,当b > 32时,系统先用b对32求余,得到的结果才是真正移位的位数。例如a>>33和a>>1的结果是完全一样的。
3.同理long类型的整数移位a>>b,总是先用b对64求余,得到的结果才是要移位的位数。

注:当进行移位运算时,只要被移位的二进制码没有发生有效位的数字丢失,则左移n位就相当于乘以2的n次方,右移n位就相当于除以2的n次方。不仅如此,进行移位运算不会改变操作数本身,只是得到一个新的运算结果,而原来的操作数本身是不会改变的。

猜你喜欢

转载自blog.csdn.net/weixin_45856580/article/details/111184844