今天看代码遇到位运算符,因为不常用已经忘记了,所以复习一下。Java位运算符包括:位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>' 。

位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。运算需要用到一些二进制知识,稍微回顾一下。比较详细,这里不再赘述了。

下面代码中有具体计算过程(稍需注意的是,Java中int类型是32bit)

//java中包含运算符 = 位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>'
            //参与位运算的数字都是二进制补码的方式进行按位与、或、异或,正数的反码、补码都是其本身

            //1. '&' 位与运算符(两个操作数都为1,结果才为1,否则结果为0)
            System.out.print("1&-3 = ");
            System.out.println(1&-3);
            /*计算过程(使用补码)
                 1:    00000000 00000000 00000000 00000001
                -3:    11111111 11111111 11111111 11111101
                结果:  00000000 00000000 00000000 00000001  (结果也是补码,因为是正数,原码相同) 1
             */

            //2. '|' 位或运算符(两个位只要有一个为1,那么结果就是1,否则就为0)
            System.out.print("1|-3 = ");
            System.out.println(1|-3);
            /*计算过程(使用补码)
                 1:    00000000 00000000 00000000 00000001
                -3:    11111111 11111111 11111111 11111101
                结果:  11111111 11111111 11111111 11111101  (结果也是补码,转成原码 10000000 00000000 00000000 00000011) -3
             */

            //3. '~' 位非运算符(如果位为0,结果是1,如果位为1,结果是0)
            System.out.print("~-3 = ");
            System.out.println(~-3);
            /*计算过程(使用补码)
                -3:    11111111 11111111 11111111 11111101
                结果:  00000000 00000000 00000000 00000010  (正数,原码相同) 2
             */

            //4. '^' 位异或运算符(两个操作数,相同则结果为0,不同则结果为1)
            System.out.print("1^-3 = ");
            System.out.println(1^-3);
            /*计算过程(使用补码)
                 1:    00000000 00000000 00000000 00000001
                -3:    11111111 11111111 11111111 11111101
                结果:  11111111 11111111 11111111 11111100  (转成原码:10000000 00000000 00000000 0000 0100) -4
             */

            //5. '<<' 左移运算符(左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0))
            System.out.print("-3<<2 = ");
            System.out.println(-3<<2);
            /*计算过程(使用补码)
                -3:    11111111 11111111 11111111 11111101
                结果:  11111111 11111111 11111111 11110100  (转成原码:10000000 00000000 00000000 00001100) -12
             */

            //6. '>>' 右移运算符("有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。如果值为正,则在高位补0,如果值为负,则在高位补1.)
            System.out.print("-3>>2 = ");
            System.out.println(-3>>2);
            /*计算过程(使用补码)
                -3:    11111111 11111111 11111111 11111101
                结果:  11111111 11111111 11111111 11111111  (转成原码:10000000 00000000 00000000 00000001) -1
             */

            //7. '>>>' 右移运算符("无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。无论值的正负,都在高位补0.)
            System.out.print("-3>>>2 = ");
            System.out.println(-3>>>2);
            /*计算过程(使用补码)
                -3:    11111111 11111111 11111111 11111101
                结果:  00111111 11111111 11111111 11111111 2^30次方 - 1 = 1073741823