java中的“&”、“|”、“^”、“~”运算符怎么用?

问题:

java源码中的位运算是如何使用的?

位运算符的用法

java中的“&”、“|”、“^”、“~”逻辑运算符的使用,此处使用了int类型,4个字节32位

&运算符

&是AND运算符,是一种位运算符。有0为0,全1为1。

运算规则如下:

  • 1&1=1;
  • 1&0=0;
  • 0&1=0;
  • 0&0=0;
    /**
     * &是AND运算符,是一种位运算符。有0为0,全1为1
     * 运算规则如下:
     * 1&1=1;
     * 1&0=0;
     * 0&1=0;
     * 0&0=0;
     */
    @Test
    public void test01() {
        //a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
        int a = 7;
        print2Binary(a);
        //b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
        int b = 2;
        print2Binary(b);
        //c=a&b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
        int c = a & b;//十进制为2
        System.out.println("a&b=" + c);
        print2Binary(c);
    }

运算结果:

十进制数[7]二进制补码表示为:111
十进制数[2]二进制补码表示为:10
a&b=2
十进制数[2]二进制补码表示为:10
|运算符

|是OR运算符,是一种位符。有1为1,全0为0

运算规则如下:

  • 1|1=1;
  • 1|0=1;
  • 0|1=1;
  • 0|0=0;
    /**
     * |是OR运算符,是一种位符。有1为1,全0为0
     * 运算规则如下:
     * 1|1=1;
     * 1|0=1;
     * 0|1=1;
     * 0|0=0;
     */
    @Test
    public void test02() {
        //a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
        int a = 7;
        print2Binary(a);
        //b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
        int b = 2;
        print2Binary(b);
        //c=a|b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
        int c = a | b;//十进制为7
        System.out.println("a|b=" + c);
        print2Binary(c);
    }

运算结果:

十进制数[7]二进制补码表示为:111
十进制数[2]二进制补码表示为:10
a|b=7
十进制数[7]二进制补码表示为:111
^运算符

^是异或运算符,是一种位符。相同为0,不同为1
运算规则如下:

  • 1^1=0;
  • 1^0=1;
  • 0^1=1;
  • 0^0=0;
    /**
     * ^是异或运算符,是一种位符。相同为0,不同为1
     * 运算规则如下:
     * 1^1=0;
     * 1^0=1;
     * 0^1=1;
     * 0^0=0;
     */
    @Test
    public void test03() {
        //a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
        int a = 7;
        print2Binary(a);
        //b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
        int b = 2;
        print2Binary(b);
        //c=a^b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0101
        int c = a ^ b;//十进制为5
        System.out.println("a^b=" + c);
        print2Binary(c);
    }

运算结果:

十进制数[7]二进制补码表示为:111
十进制数[2]二进制补码表示为:10
a^b=5
十进制数[5]二进制补码表示为:101
~运算符

~是非运算符,是一种位符。0取反为1,1取反为0
运算规则如下:

  • ~1=0;
  • ~0=1;
    /**
     * ~是非运算符,是一种位符。0取反为1,1取反为0
     * 运算规则如下:
     * ~1=0;
     * ~0=1;
     */
    @Test
    public void test04() {
        //a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
        int a = 7;
        print2Binary(a);
        /**
         * b按位二进制补码表示为 1111 1111 1111 1111 1111 1111 1111 1000
         * b的二进制原码表示则为 1000 0000 0000 0000 0000 0000 0000 1000
         * 原码的第一位为符号位1代表负数,值为-8
         */
        int b = ~a;
        System.out.println("~a取反为:" + b);
        print2Binary(b);
    }

运算结果:

十进制数[7]二进制补码表示为:111
~a取反为:-8
十进制数[-8]二进制补码表示为:11111111111111111111111111111000

其中打印二进制的方法print2Binary如下:

    /**
     * 打印十进制数二进制
     *
     * @param a
     */
    private void print2Binary(int a) {
        StringBuilder sb = new StringBuilder();
        sb.append("十进制数[");
        sb.append(a);
        sb.append("]二进制补码表示为:");
        sb.append(Integer.toBinaryString(a));
        System.out.println(sb.toString());
    }

其他位运算:<< 、>>在《java位于算——一个测试搞懂位运算》中有做说明

猜你喜欢

转载自blog.csdn.net/u011047968/article/details/106730822