java的三种移位运算符>>、>>>和左移——其中特殊的负数

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”表示符号。(即左数第一个数字)

 

以上,

不明白的地方可以评论,我会耐心解答。

本人原创,觉得有用的点个赞哈,以鼓励我继续为大家趟路、继续原创。

 

 

你可能感兴趣的:(JAVA)