运算符篇:无符号右移、与、或、异、取反运算符

214 阅读4分钟

无符号右移运算符 —— m>>>n

  • 个人分析:

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

    步骤二:数据尾指针按照位数 n 前移,不管十进制正负,全部补0。

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

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 21;
            // 二进制是 0000 0000 0000 0000 0000 0000 0001 0101
            System.out.println("a>>>1=" + (a >>> 1));
            System.out.println("a>>>2=" + (a >>> 2));
            System.out.println("a>>>26=" + (a >>> 26));
            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("a>>>1=" + (a >>> 1));
            System.out.println("a>>>2=" + (a >>> 2));
            System.out.println("a>>>26=" + (a >>> 26));
            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=2147483637
    a>>>2=1073741818
    a>>>26=63
    a>>>27=31
    a>>>28=15
    a>>>29=7
    a>>>30=3
    

与运算符 —— m&n

  • 个人分析:

    步骤一:mn 都转化成二进制数

    步骤二:两个二进制数从尾指针对齐。

    步骤三:尾指针前移。

    m 的二进制[尾指针] == 1 且 n 的二进制[尾指针] == 1,则新二进制[尾指针] == 1。

    否则,新二进制[尾指针] == 0。

    步骤四:获得新二进制,转换成十进制。

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 10;
            // a 的二进制是 1010
            int b = 14;
            // b 的二进制是 1110
            int c = 5;
            // c 的二进制是 0101
            System.out.println("a & b = " + (a & b));
            System.out.println("a & c = " + (a & c));
        }
    }
    

    结果:

    a & b = 10
    a & c = 0
    

或运算符 —— m|n

  • 个人分析:

    步骤一:mn 都转化成二进制数

    步骤二:两个二进制数从尾指针对齐。

    步骤三:尾指针前移。

    ​ 若 m 的二进制[尾指针] == 1 或 n 的二进制[尾指针] == 1,则新二进制[尾指针] == 1。

    ​ 否则,新二进制[尾指针] == 0。

    步骤四:获得新二进制,转换成十进制。

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 10;
            // a 的二进制是 1010
            int b = 14;
            // b 的二进制是 1110
            int c = 5;
            // c 的二进制是 0101
            System.out.println("a | b = " + (a | b));
            System.out.println("a | c = " + (a | c));
        }
    }
    

    结果:

    a | b = 14
    a | c = 15
    

异运算符 —— m^n

  • 个人分析:

    步骤一:mn 都转化成二进制数

    步骤二:两个二进制数从尾指针对齐。

    步骤三:尾指针前移。

    ​ 若 m 的二进制[尾指针] == n 的二进制[尾指针],则新二进制[尾指针] == 0。

    ​ 否则,新二进制[尾指针] == 1。

    步骤四:获得新二进制,转换成十进制。

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 10;
            // a 的二进制是 1010
            int b = 14;
            // b 的二进制是 1110
            int c = 5;
            // c 的二进制是 0101
            System.out.println("a ^ b = " + (a ^ b));
            System.out.println("a ^ c = " + (a ^ c));
        }
    }
    

    结果:

    a ^ b = 4
    a ^ c = 15
    

取反运算符 —— ~m

  • 个人分析:

    步骤一:m 转化成二进制数

    步骤二:m 的二进制数 1 变成 0 ,0 变成 1。

    步骤三:获得新的二进制数,末尾加一,转换成十进制。

  • 例子:

    public class test {
        public static void main(String[] args) {
            int a = 10;
            // a 的二进制是 1010
            int b = 5;
            // b 的二进制是 0101
            System.out.println("~a = " + (~a));
            System.out.println("~b = " + (~b));
            System.out.println("---------------");
            a = -10;
            b = -5;
            System.out.println("~a = " + (~a));
            System.out.println("~b = " + (~b));
        }
    }
    

    结果:

    ~a = -11
    ~b = -6
    ---------------
    ~a = 9
    ~b = 4
    

总结

  1. 无符号右移运算符就是不管正负全部补0
  2. 与运算符—— 1 & 1 = 1,1 & 0 = 0。 全对的才对
  3. 或运算符—— 1 | 1 = 1,1 | 0 = 1,0 | 0 = 0。有对的就对。
  4. 异运算符—— 1 ^ 1 = 0,0 ^ 0 = 0,1 ^ 0 = 1。不一样的就对。
  5. 取反运算符—— ~m = -m - 1。取反数-1。