运算符篇:左移右移运算符

255 阅读1分钟

运算符篇:左移右移运算符

1. 左移运算符—— m<<n

  • 个人分析:

    步骤一:先将 m 化为二进制数。

    步骤二:数据头指针按照位数 n 后移,在尾指针后移补 n 个 0。

    1. 若二进制的 n 位之前都没有 1 ,跳转至 步骤三。

    2. 若二进制的 n 位之前都有 1 ,则跳转至 步骤三。

    步骤三:获得 步骤二_1 的二进制数,转化成十进制数,得到结果。

    ​ 获得 步骤二_2 的二进制数,转化成十进制数乘 -1,得到结果。

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 21;
            // 二进制是 0000 0000 0000 0000 0000 0000 0001 0101
            System.out.println("范围内");
            System.out.println("a<<1=" + (a << 1));
            System.out.println("a<<2=" + (a << 2));
            System.out.println("a<<26=" + (a << 26));
            System.out.println("超出范围");
            System.out.println("a<<27=" + (a << 27));
            System.out.println("a<<28=" + (a << 28));
            System.out.println("a<<29=" + (a << 29));
            System.out.println("a<<30=" + (a << 30));
            System.out.println("--------------------");
            a = -21;
            // 二进制是 1111 1111 1111 1111 1111 1111 1110 1011
            // 数字取反,末尾加一
            System.out.println("范围内");
            System.out.println("a<<1=" + (a << 1));
            System.out.println("a<<2=" + (a << 2));
            System.out.println("a<<26=" + (a << 26));
            System.out.println("超出范围");
            System.out.println("a<<27=" + (a << 27));
            System.out.println("a<<28=" + (a << 28));
            System.out.println("a<<29=" + (a << 29));
            System.out.println("a<<30=" + (a << 30));
        }
    }
    

    结果:

    范围内
    a<<1=42
    a<<2=84
    a<<26=1409286144
    超出范围
    a<<27=-1476395008
    a<<28=1342177280
    a<<29=-1610612736
    a<<30=1073741824
    --------------------
    范围内
    a<<1=-42
    a<<2=-84
    a<<26=-1409286144
    超出范围
    a<<27=1476395008
    a<<28=-1342177280
    a<<29=1610612736
    a<<30=-1073741824
    

2. 右移运算符 —— m>>n

  • 个人分析:

    步骤一:先将 m 化为二进制数。

    步骤二:数据尾指针按照位数 n 前移

    1. 若十进制的 m 是正数,头指针前移 n 位补0,跳转至 步骤三。
    2. 若十进制的 m 是负数,头指针前移 n 位补1,跳转至 步骤三。

    步骤三:获得 步骤二 的二进制数,转化成十进制数,得到结果。

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 21;
            // 二进制是 0000 0000 0000 0000 0000 0000 0001 0101
            System.out.println("范围内");
            System.out.println("a>>1=" + (a >> 1));
            System.out.println("a>>2=" + (a >> 2));
            System.out.println("a>>26=" + (a >> 26));
            System.out.println("超出范围");
            System.out.println("a>>27=" + (a >> 27));
            System.out.println("a>>28=" + (a >> 28));
            System.out.println("a>>29=" + (a >> 29));
            System.out.println("a>>30=" + (a >> 30));
            System.out.println("--------------------");
            a = -21;
            // 二进制是 1111 1111 1111 1111 1111 1111 1110 1011
            // 数字取反,末尾加一
            System.out.println("范围内");
            System.out.println("a>>1=" + (a >> 1));
            System.out.println("a>>2=" + (a >> 2));
            System.out.println("a>>26=" + (a >> 26));
            System.out.println("超出范围");
            System.out.println("a>>27=" + (a >> 27));
            System.out.println("a>>28=" + (a >> 28));
            System.out.println("a>>29=" + (a >> 29));
            System.out.println("a>>30=" + (a >> 30));
        }
    }
    

    结果:

    范围内
    a>>1=10
    a>>2=5
    a>>26=0
    超出范围
    a>>27=0
    a>>28=0
    a>>29=0
    a>>30=0
    --------------------
    范围内
    a>>1=-11
    a>>2=-6
    a>>26=-1
    超出范围
    a>>27=-1
    a>>28=-1
    a>>29=-1
    a>>30=-1
    

总结:

  1. m<<n 表示在一定范围内等于 m*2^n
  2. m>>n 表示在一定范围内等于 m/2^n
  3. 如果超出范围的时候,会变符号