java基础-操作符-移位操作符

java中的操作符:1.操作符接收一个或多个参数,并生成一个新值;

                             2.有些操作符可以改变操作数本身的值,这被称为副作用,例如自增,自减操作符,这类带有副作用的操作符  的最普遍的用途就是用来产生副作用。但是使用此类操作符生成的值,与没有副作用的操作符生成的值没有什么区别。

                             3.几乎所有的操作符都只能操作"基本类型",例外的是"=","==","!="。这三个操作符可以操作所有对象。

                             4.String类支持"+","+="操作符。

 

java中的移位操作符:操作的对象也是二进制的位,并且只能操作整数类型。

左移位操作符(<<):将操作符左边的操作数按照操作符右边指定的位数向左移动,并在低位补0;

有符号右移位操作符(>>):将操作符左边的操作数按照操作符右边指定的位数向右移动,并且使用了符号扩展,若符号为正,则在高位插入0,若为负,则在高位插入1;

无符号右移位操作符(>>>):将操作符左边的操作数按照操作符右边指定的位数向右移动,并且使用了0扩展,无论正负,都在高位插入0。

对char,byte,short类型的数值进行移位处理时,在移位之前,它们会被转为int型,并且得到的结果也是一个int型数值。只有数值右端低5位才有用,这样可以防止我们移位超过int型值所具有的位数。(int型数值的位数为32位,即2的5次方)。

对long型数值进行移位操作时,最后得到的结果也是long型,并且只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。(64位,即2的6次方)

移位可以与等号联合一起使用:<<=,>>=,>>>=。操作符左边的数值会按照操作符右边的数值移动指定的位数,再将得到的结果赋给左边的变量。但在进行无符号右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果,它们会先被转换成int型,再进行右移操作,然后被截断,赋值给原来的类型(不是int型了),在这种情况下可能得到-1的结果。

一.测试左移位操作符:

结果为:

分析在图中,这里不多说了。

2.解析在移位时,为何只有数值右端低5位才有用

java中规定:没有任何移位操作符可以让一个数字丢弃其所有的位(对应类型的所有位)。

这个数值右端低5位指的是右操作数的低5位。因为int类型值只有32位长度,如果让左操作数移位32位或以上的话,那么这个int类型数据就完全变了。对于左移位来说是在低位补0,对于任何一个int类型的数据如果左移位32次,那么这个int数据就会变成32位全0的数据。java中不允许一次性移位左操作数的所有位,也就是右操作数不能大于32,如果右操作数大于32,就取右操作数二进制的低5位来计算要移位的位数,因为五位二进制数所代表的最大数值是2^5-1=31,这样,就满足了移位次数的要求。在进行移位时,可以让右操作数对32取余。即A%32的结果就是需要移位的位数。如果右操作数为负数,那么取它二进制补码的后5位作为计算需要移位的位数。对于long类型来说,是取的低6位。

验证如下:

结果为:

3.测试右操作数为负数时的移位运算

测试结果:

long类型的移位同理。这里不说了。

4.测试有符号右移位操作符(>>)

测试结果为:

5.测试无符号右移位操作符(>>>)

输出结果为:

6.测试移位操作符与等号联用

移位操作符同理也可以与等号连用,含义是先移位,再把移位后的这个值赋值给左操作数。表达式为a<<=2,a>>=2,a>>>=2。但要注意的是,在进行无符号右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果,它们会先被转换成int类型,再进行右移位操作,然后被截断,赋值给原来的类型,这种情况下可能会得到-1的结果。

输出结果:

需要解析的是:对于byte和short的值-1,本来都是先转化为int,二进制为:11111111111111111111111111111111,两个都无符号右移位10位,都在高位补0,结果为:00000000001111111111111111111111,结合了赋值运算符后,所得的值要返回给它们2个,但是由于所得的值为int类型的,要返回成byte类型和short类型,就要从低位截取了,byte截取低8位,,结果为11111111,short截取低16位,结果为1111111111111111,这2个值都是-1,本来没有结合赋值运算符前,得到的结果应该都是4194303.结合后,结果都是-1了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值