补充:int 为32位,为方便描述,以下以8位代替。计算机中以补码的形式来运算,故先转为补码来算。
- >>
- 释义:带符号右移,即移位时空缺的位用符号位来补。(带符号为与后面的>>>对比)
- 例:
- 先看正数:
int rightTwo=4;
System.out.println(rightTwo>>2);//result:1
过程:
4的补码:其符号位为0——–0000 0100
第:一步:向右移两位————–00 0001
第二步:以符号位来补高位—0000 0001
于是结果为1 - 再看负数:
int rightTwo=-4;
System.out.println(rightTwo>>2);//result:-1
过程:
-4的补码:其符号位为1 ——1111 1100
第一步:向右移两位—————11 1111
第二步:以符号位来补高位—1111 1111
于是结果为-1
- 先看正数:
- 常见应用:求2的N次方?//2>>(n-1)
- <<
- 释义:左移,由于是左移,低位直接补0,故不存在带不带符号的问题。
- 例:
- 先看正数:
int leftTwo=7;
System.out.println(leftTwo<<1);//result:14
过程:
7的补码:其符号位为0——0000 0111
第一步:向坐移一位———0000 111
第二步:以0来补低位——–0000 1110
于是结果为14 - 再看负数:
int leftTwo=-7;
System.out.println(leftTwo<<1);//result:-14
过程:
-7的补码:其符号位为0—–1111 1001
第一步:向坐移一位———1111 001
第二步:以0来补低位——–1111 0010
于是结果为-14
- 先看正数:
- >>>
- 释义:右移,即移位时空缺的位用0来补
- 例:
- 先看正数:
int rightThree=4;
System.out.println(rightThree>>>2);//result:1
过程:
4的补码:———————0000 0100
第一步:向右移两位————00 0001
第二步:以0来补高位——-0000 0001
于是结果为1 - 再看负数:
int rightThree=-4;
System.out.println(rightThree>>>2);//result:1073741823
注意:1073741823此结果已超过8位,故以8位代替演示是不行的,此处转为32位。(以省略号代替)
过程:
-4的补码:——————–…1111 1100
第一步:向右移两位————…11 1111
第二步:以0来补高位——-00…11 1111
于是结果为1073741823
- 先看正数:
提示:byte、short和char类型的表达式移位后的表达式类型为int 类型。
byte rightThree=-4;
System.out.println(rightThree>>>2);//result:1073741823