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了。