Java中,<<、>>、>>>都是在数字的二进制中进行的 。
老样子,直接先上代码(服不服,运行看):
public static void main(String[] args) {
System.out.println("1>>4 运算的结果是 :" + ((1) >> 4));
System.out.println("1>>>4 运算的结果是 :" + ((1) >>> 4));
System.out.println("1<<4 运算的结果是 :" + ((1) << 4));
System.out.println("");
System.out.println("-1>>4 运算的结果是 :" + ((-1) >> 4));
System.out.println("-1>>>4 运算的结果是 :" + ((-1) >>> 4));
System.out.println("-1<<4 运算的结果是 :" + ((-1) << 4));
System.out.println("");
System.out.println("16>>2 运算的结果是 :" + ((16) >> 2));
System.out.println("16>>>2 运算的结果是 :" + ((16) >>> 2));
System.out.println("16<<2 运算的结果是 :" + ((16) << 2));
System.out.println("");
System.out.println("-16>>2 运算的结果是 :" + ((-16) >> 2));
System.out.println("-16>>>2 运算的结果是 :" + ((-16) >>> 2));
System.out.println("-16<<2 运算的结果是 :" + ((-16) << 2));
System.out.println("");
System.out.println("33>>5 运算的结果是 :" + ((33) >> 5));
System.out.println("33>>>5 运算的结果是 :" + ((33) >>> 5));
System.out.println("33<<5 运算的结果是 :" + ((33) << 5));
System.out.println("");
System.out.println("-33>>5 运算的结果是 :" + ((-33) >> 5));
System.out.println("-33>>>5 运算的结果是 :" + ((-33) >>> 5));
System.out.println("-33<<5 运算的结果是 :" + ((-33) << 5));
}
1>>4 运算的结果是 :0
1>>>4 运算的结果是 :0
1<<4 运算的结果是 :16
-1>>4 运算的结果是 :-1
-1>>>4 运算的结果是 :268435455
-1<<4 运算的结果是 :-16
16>>2 运算的结果是 :4
16>>>2 运算的结果是 :4
16<<2 运算的结果是 :64
-16>>2 运算的结果是 :-4
-16>>>2 运算的结果是 :1073741820
-16<<2 运算的结果是 :-64
33>>5 运算的结果是 :1
33>>>5 运算的结果是 :1
33<<5 运算的结果是 :1056
-33>>5 运算的结果是 :-2
-33>>>5 运算的结果是 :134217726
-33<<5 运算的结果是 :-1056
这里我解释其中一个例子:
由于,在计算机中,负数采用二进制的补码方式存储(不明白自己上网查一下),重要的话说三遍:
所以,针对负数的左、右移都是由补码开始移动的!!
所以,针对负数的左、右移都是由补码开始移动的!!
所以,针对负数的左、右移都是由补码开始移动的!!
最后,对移动后的补码再取补码,才得到原码。然后转化为10进制,即为移动后我们要的数值。
补充知识点:
10进制转为二进制得到的是原码,将原码按位取反得到的是反码,反码加1得到补码,补码的补码得到的是原码。
二进制的最高位是符号位,0表示正,1表示负。
-1的原码: 10000000 00000000 00000000 00000000
-1的补码: 11111111 11111111 11111111 11111111
-1>>4:
00001111 11111111 11111111 11111111(-1的补码先“右移4位”)
00001000 00000000 00000000 00000001(再取补,这样才是原码)= -1
说明:最前面的那个“1”表示符号。(即左数第五个数字)
-1>>>4:
00001111 11111111 11111111 11111111(-1的补码先“无符号右移4位”)
00001111 11111111 11111111 11111111(再取补,这样才是原码)= 268435455
说明:无符号位右移,由于无符号位右移的规定结果必须是正数,所以原符号位的“1”被自动转换为对应的数值,不再代表符号)。且,正数的补码是本身,所以不变。
-1<<4:
11111111 11111111 11111111 11110000(-1的补码左移4位)
10000000 00000000 00000000 00010000(再取补,这样才是原码)= -16
说明:最前面的那个“1”表示符号。(即左数第一个数字)
以上,
不明白的地方可以评论,我会耐心解答。
本人原创,觉得有用的点个赞哈,以鼓励我继续为大家趟路、继续原创。