今天我们来一起了解下 JAVA中的移位操作符。
移位操作符的运算对象是二进制的“位”,只能用来处理整数类型(char、byte、short、int、long)。
操作符名称 | 符号 | 含义 |
---|---|---|
左移位操作符 | << | 将右侧指定位数向左移动,在低位补0 |
右移位操作符(区分正负) | >> | 将右侧指定位数向右移动,若符号为正,在高位插入0;若符合为负,在高位插入1 |
右移位操作符(不区分正负) | >>> | 将右侧指定位数向右移动,无论正负,在高位插入0 |
3类操作符均可和 “=” 进行组合,将移位后的值赋值给被移位对象(<<=、>>=、>>>=)。
1.左移位操作符
int i1 = 2;
System.out.println("十进制======="+i1);
System.out.println("二进制======="+Integer.toBinaryString(i1));
i1 <<= 2;
System.out.println("十进制======="+i1);
System.out.println("二进制======="+Integer.toBinaryString(i1));
十进制=======2
二进制=======10
十进制=======8
二进制=======1000
2.右移位操作符(区分正负)
正号运算
int i1 = 16;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
i1 >>= 2;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
十进制=======16
二进制=======10000
十进制=======4
二进制=======100
负号运算
int i1 = -16;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
i1 >>= 2;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
十进制=======-16
二进制=======11111111111111111111111111110000
十进制=======-4
二进制=======11111111111111111111111111111100
3.右移位操作符(不区分正负)
int i1 = 16;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
i1 >>>= 2;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
十进制=======16
二进制=======10000
十进制=======4
二进制=======100
int i1 = -16;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
i1 >>>= 2;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
十进制=======-16
二进制=======11111111111111111111111111110000
十进制=======1073741820
二进制=======111111111111111111111111111100
注意事项:
1.在使用移位操作符的时候,移动的位数不要超过该类型的位数长度,int 类型占 32 位,long 类型占 64 位,否则运算结果会不正确。
(1)int 类型
int i1 = 2;
System.out.println("十进制=======" + i1);
System.out.println("二进制=======" + Integer.toBinaryString(i1));
System.out.println("i1 << 30 的二进制=======" + Integer.toBinaryString(i1 << 30));
System.out.println("i1 << 31 的二进制=======" + Integer.toBinaryString(i1 << 31));
十进制=======2
二进制=======10
i1 << 30 的二进制=======10000000000000000000000000000000
i1 << 31 的二进制=======0
(2)long类型
long l1 = 2L;
System.out.println("十进制=======" + l1);
System.out.println("二进制=======" + Long.toBinaryString(l1));
System.out.println("i1 << 62 的二进制=======" + Long.toBinaryString(l1 << 62));
System.out.println("i1 << 63 的二进制=======" + Long.toBinaryString(l1 << 63));
十进制=======2
二进制=======10
i1 << 62 的二进制=======1000000000000000000000000000000000000000000000000000000000000000
i1 << 63 的二进制=======0
2.char 、byte 、short 类型在进行移位运算时,会转换为 int 类型,并且运算结果也为 int 类型。
int i1 = 2;
char c1 = 2;
byte b1 = 2;
short s1 = 2;
System.out.println("i1 的二进制位" + Integer.toBinaryString(i1));
System.out.println("c1 的二进制位" + Integer.toBinaryString(c1));
System.out.println("b1 的二进制位" + Integer.toBinaryString(b1));
System.out.println("s1 的二进制位" + Integer.toBinaryString(s1));
System.out.println("i1 的二进制=======" + Integer.toBinaryString(i1 << 30));
System.out.println("c1 的二进制=======" + Integer.toBinaryString(c1 << 30));
System.out.println("b1 的二进制=======" + Integer.toBinaryString(b1 << 30));
System.out.println("s1 的二进制=======" + Integer.toBinaryString(s1 << 30));
i1 的二进制位10
c1 的二进制位10
b1 的二进制位10
s1 的二进制位10
i1 的二进制=======10000000000000000000000000000000
c1 的二进制=======10000000000000000000000000000000
b1 的二进制=======10000000000000000000000000000000
s1 的二进制=======10000000000000000000000000000000
3.char 、byte 、short 类型在进行移位运算时,若使用 “=” 号将运算结果赋值给被转换对象,int 类型的运算结果会被截取指定位数(char、short 截取16位,byte 类型截取8位)后再赋值,会造成不正确的运算结果。
char c1 = 2;
System.out.println("c1 的二进制=======" + Integer.toBinaryString(c1 << 14));
c1 <<= 14;
System.out.println("c1 的二进制=======" + Integer.toBinaryString(c1));
char c2 = 2;
System.out.println("c2 的二进制=======" + Integer.toBinaryString(c2 << 15));
c2 <<= 15;
System.out.println("c2 的二进制=======" + Integer.toBinaryString(c2));
c1 的二进制=======1000000000000000
c1 的二进制=======1000000000000000
c2 的二进制=======10000000000000000
c2 的二进制=======0
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!