运算符篇:左移右移运算符
1. 左移运算符—— m<<n
-
个人分析:
步骤一:先将 m 化为二进制数。
步骤二:数据头指针按照位数 n 后移,在尾指针后移补 n 个 0。
-
若二进制的 n 位之前都没有 1 ,跳转至 步骤三。
-
若二进制的 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 前移
- 若十进制的 m 是正数,头指针前移 n 位补0,跳转至 步骤三。
- 若十进制的 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
总结:
- m<<n 表示在一定范围内等于 m*2^n
- m>>n 表示在一定范围内等于 m/2^n
- 如果超出范围的时候,会变符号