一.移位运算符
1. 概述:Java共提供了3种移位运算符,分别为带符号左移位运算符<<,带符号右移位运算符>>和无符号右移位运算符>>>。Java语言没有提供循环移位运算符。移位运算符的操作只能是整数型,即字符型,字节型,短整型,整型,长整型。进行移位运算时,总是先将字符型,字节型,短整型转换为整型再进行移位运算,实际上移位操作对象只有整型或长整型。
2.类别
(1)>> 运算符:带符号右移运算将运算符左边的运算对象向右移动由运算符右侧指定的位数,若值为正,则在高位插入0,若值为负,则在高位插入1,即移入的最高位和原最高符号位相同。带符号的右移位运算相当于对左操作数进行除2运算。
(2)<< 运算符:带符号左移位运算符将运算符左边的对象向左移由运算符右侧指定的位数,在低位补0,即左移时最低位始终补0,最高位被舍去。带符号的左移位运算相当于对左操作数进行乘2运算。
(3)>>> 运算符:无符号右移位运算符使用了0扩展,无论运算符左边的运算对象取值正负,都在高位插入0,即移位始终补0。
(4)~运算符:按位取反运算符。注意:这个不是移位运算符,是位运算符。
3.代码演示
package cn.dong;
public class Demo01 {
public static void main(String[] args) {
//按位取反
int x = 2;
int y = ~x;
//00000010----(2)
//11111101(对2按位取反)-->反码11111100-->原码10000011 (-3)
System.out.println(x); //2
System.out.println(y); //-3
//带符号运算符右移 最高位添加符号位,末位舍去
int x1 = -2;
int y1 = x1 >> 1;
//11111110(-2)
//11111111(右移一位)-->反码11111110-->原码10000001 (-1)
System.out.println(x1); //-2
System.out.println(y1); //-1
//带符号运算符左移 最高位舍去,末位加0 可能发生溢出
int x2 = -2;
int y2 = x2 << 1;
//11111110 (-2)
//11111100(左移一位)-->反码11111011-->原码10000100 (-4)
System.out.println(x2); //-2
System.out.println(y2); //-4
//不带符号运算符右移 末位舍去,最高位补0 可能发生溢出
int x3 = 2;
int y3 = x3 >>> 1;
//00000010 (2)
//00000001 (1)
System.out.println(x3); //2
System.out.println(y3); //1
}
}
注意:移位运算符,位运算符,算术运算符都需要将char,byte,short先转换为int在进行运算。