1、左移(<<)
左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。
左移移位相当于乘以2
//0000 0000 0000
//0000 0000 1000 1<<3
//0000 0001 0000 1<<4 1*2的4次方=1*2*2*2*2=16
int i = 1<<3;//8
int i2 = 1<<4;//8
System.out.println(i);//8
System.out.println(i2);//16
//0000 0000 0010
//0000 0001 0000 2<<3 2*2*2*2
int i3 = 2<<3;//这样 将第二位往前面移动3位
System.out.println(i3);//16
//0000 0000 0011
//0000 0001 1000 3<<3 3*2*2*2=24,将3左移3位,没移动一位就是*2,移动3次就是3个*2=2*2*2=8
int i4 = 3<<3;//这样 将第二位往前面移动3位
System.out.println(i4);//24
2、右移(>>)
右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。
“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。
//0000 0000 0010
//0000 0000 0001 2>>1
int i = 2 >> 1;
System.out.println(i);//1
//0000 0000 0001
//0000 0000 0000 1>>1
int i2 = 1 >> 1;
System.out.println(i2);//0
//0000 0001 1000
//0000 0000 0011 24>>3 相当于将24往前面移动3位,每移动一位就/2,移动了3次=24*2*2*2*2=3
int i3 = 24 >> 3;
System.out.println(i3);//3
//0000 0001 1001
//0000 0000 0011 25>>3 相当于将25往前面移动3位,每移动一位就/2,移动了3次=25-1/2/2/2/2=3
int i4 = 25 >> 3;
System.out.println(i4);//3(这里为什么要为3,第一在往右移时,如果为25,那么右边的第一位肯定是1,这个时候移动了后右边
//第一位肯定就位0了,所以在计算时,可以这样理解(25-1)/2/2/2/2=3
//0000 0001 1001
//0000 0000 1100 25>>1 相当于将25往前面移动1位,每移动一位就/2,移动了3次=(25-1)/2=12
int i5 = 25 >> 1;
System.out.println(i5);//12
//总结:只要往右移动,首先-1,在/2运算;
3、&
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0。
//0100 4
//0011 3
int i = 4 & 3;
System.out.println(i);//0
//0101 5
//0011 3
int i2 = 5 & 3;
System.out.println(i2);//1
//总结:两个操作数中位都为1,结果才为1,否则结果为0
4、|
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0
//0100 4
//0011 3
int i = 4 | 3;
System.out.println(i);//7
//0101 5
//0011 3
int i2 = 5 | 3;
System.out.println(i2);//7
//总结:两个位只要有一个为1,那么结果就是1,否则就为0
5、~
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0。
6、^
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。