编程语言
首页 > 编程语言> > Java : Java中的有符号右移运算>>和无符号右移运算>>>,原码、反码、补码的简单介绍

Java : Java中的有符号右移运算>>和无符号右移运算>>>,原码、反码、补码的简单介绍

作者:互联网

时不时地会被这两个绕一下,干脆写个demo加深记忆。

背景知识

规律

ps: java中可以使用Integer.toBinaryString()来获取一个整数的补码表示,注意这里是补码,不是原码,原码=补码的补码。

有符号右移运算>>

1.将正整数11有符号右移3位:

+11>>

很容易看出:

对于正整数:有符号右移n位,结果的补码等于在高位补了n个0,低位溢出舍弃

正整数原码、反码和补码 三码合一,所以不需要操心太多。

2.将负整数-11有符号右移3位:

-11>>

注意注意,这里的结果是补码哦。

根据补码的补码等于原码规律,可以求出原码是:10000000000000000000000000000010,换算成整数是-2

对于负整数:有符号右移n位,结果的补码等于在补码的高位补了n个1,低位溢出舍弃

注意是结果的补码,不是原码。

无符号右移运算>>

1.将正整数11无符号右移3位:

+11>>>

这里跟有符号右移是一样的。

2.将负整数-11无符号右移3位:

-11>>>

可以看出是在高位补了3个0哈。

对于负整数:无符号右移n位,结果的补码等于在补码的高位补了n个0,低位溢出舍弃

所以无符号右移,对于正整数和负整数,结果的补码都等于是在高位补0.

源代码:

/**
 *  有符号右移和无符号右移
 */
public class RightShift {

    public static void main(String args[]){
        RightShift rightShift = new RightShift();
        rightShift.signedRightShift(11);
        rightShift.signedRightShift(-11);
        rightShift.unsignedRightShift(11);
        rightShift.unsignedRightShift(-11);
    }

    /**
     *  有符号右移
     * @param n
     */
    public void signedRightShift(int n){
        System.out.println(n+"的有符号右移...........");
        System.out.println("参数整型是:"+n);
        System.out.println("参数补码是:"+Integer.toBinaryString(n));
        int a = n>>3; // 有符号右移三位
        System.out.println("结果整型是:"+a);
        System.out.println("结果补码是:"+Integer.toBinaryString(a));
    }

    /**
     * 无法符号右移
     * @param n
     */
    public void unsignedRightShift(int n){
        System.out.println(n+"的无符号右移...........");
        System.out.println("参数整型是:"+n);
        System.out.println("参数补码是:"+Integer.toBinaryString(n));
        int a = n>>>3; // 无符号右移三位
        System.out.println("结果整型是:"+a);
        System.out.println("结果补码是:"+Integer.toBinaryString(a));
    }
}

标签:右移,11,Java,运算,符号,补码,println,原码
来源: https://www.cnblogs.com/northwest332/p/16229774.html