Java位运算符

Java位运算符有:|(按位或操作符),&(按位与操作符),~(按位取反操作符),^(按位异或操作符),>>>(按位右移补零操作符),>>(按位右移操作符),<<(按位左移操作符)。应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

  1. |(按位或操作符)
    只要两个数的二进制形式相对应位上有一个是1,则计算后得到的数相应的位为1,否则为0;符号位也要参与计算。
     

    public static void main(String[] args) {
    	// TODO Auto-generated method stub
        int op1 = 4,op2 = -2,result;
        result = op1|op2;
        System.out.println("result的十进制形式:"+result);
        System.out.println("op1的二进制形式:"+Integer.toBinaryString(op1));
        System.out.println("op2的二进制形式:"+Integer.toBinaryString(op2));
        System.out.println("result的二进制形式:"+Integer.toBinaryString(result));
    }
    result的十进制形式:-2
    op1的二进制形式:100
    op2的二进制形式:11111111111111111111111111111110
    result的二进制形式:11111111111111111111111111111110

    op1为正数,计算机储存的是它的原码:100;op2为负数,计算机储存的是它的补码:11111111111111111111111111111110。从右向左看:op1第一位是0,op2第一位是0,所以result的第一位是0;op1的第二位是0,op2的第二位是1,所以result的第二位是1;op1的第三位是1,op2的第三位是1,所以result的第三位是1;op1从第四位开始到最高位全为0(前导零没显示出来),op2从第四位起到最高位全为1,所以result从第四位到最高位全为1;最后得到result的二进制形式为:11111111111111111111111111111110。二进制的result转成十进制可按下面方法计算:由于符号位(最高位)为1,所以这是一个负数,我们先将符号位去除只对剩余的31位进行操作,最后在得到的十进制数前加一负号即可。

  2. &(按位与操作符)
    只有两个数的二进制相对应位上全为1,计算后得到的数相对应的位才为1,否则为0;符号位也要参与计算。
     

    public static void main(String[] args) {
    	// TODO Auto-generated method stub
        int op1 = 4,op2 = -2,result;
        result = op1&op2;
        System.out.println("result的十进制形式:"+result);
        System.out.println("op1的二进制形式:"+Integer.toBinaryString(op1));
        System.out.println("op2的二进制形式:"+Integer.toBinaryString(op2));
        System.out.println("result的二进制形式:"+Integer.toBinaryString(result));
    }
    结果的十进制形式:4
    op1的二进制形式:100
    op2的二进制形式:11111111111111111111111111111110
    结果的二进制形式:100

     

  3. ~(按位取反操作符)
    将一个数的二进制形式每一个位取反;符号位要参与计算。

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int op1 = 4,result;
        result = ~op1;
        System.out.println("result的十进制形式:"+result);
        System.out.println("op1的二进制形式:"+Integer.toBinaryString(op1));
        System.out.println("result的二进制形式:"+Integer.toBinaryString(result));
    }
    result的十进制形式:-5
    op1的二进制形式:100
    result的二进制形式:11111111111111111111111111111011

     

  4. ^(按位异或操作符)
    只有两个数的二进制形式相对应位上的值一样,计算后得到的数相对应位上的值才为0,否则为1;符号位要参与计算。

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    	    int op1 = 4,op2 = -2,result;
    	    result = op1^op2;
    	    System.out.println("result的十进制形式:"+result);
    	    System.out.println("op1的二进制形式:"+Integer.toBinaryString(op1));
    	    System.out.println("op2的二进制形式:"+Integer.toBinaryString(op2));
    	    System.out.println("result的二进制形式:"+Integer.toBinaryString(result));
    	}
    result的十进制形式:-6
    op1的二进制形式:100
    op2的二进制形式:11111111111111111111111111111110
    result的二进制形式:11111111111111111111111111111010
    

     

  5. >>>(按位右移补零操作符)
    将一个数的二进制形式向右移动指定位数,左边补零;符号位也要移动。

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    	    int op1 = -4,result;
    	    result = op1 >>> 1;
    	    System.out.println("result的十进制形式:"+result);
    	    System.out.println("op1的二进制形式:"+Integer.toBinaryString(op1));
    	    System.out.println("result的二进制形式:"+Integer.toBinaryString(result));
    	}
    result的十进制形式:2147483646
    op1的二进制形式:11111111111111111111111111111100
    result的二进制形式:1111111111111111111111111111110

    将op1按位右移补零1位得到result。result的二进制形式最左边补了一个零,由于是前导零所以没显示,我们可以数一下result只有31位。

  6. >>(按位右移操作符)
    将一个数的二进制形式向右移动指定位数,左边补符号位上的值;符号位也要移动。

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    	    int op1 = -5,result;
    	    result = op1 >> 1;
    	    System.out.println("result的十进制形式:"+result);
    	    System.out.println("op1的二进制形式:"+Integer.toBinaryString(op1));
    	    System.out.println("result的二进制形式:"+Integer.toBinaryString(result));
    	}
    
    result的十进制形式:-3
    op1的二进制形式:11111111111111111111111111111011
    result的二进制形式:11111111111111111111111111111101

     

注意:

  • 当两个操作数为boolean类型时,|和&为逻辑运算符。相关链接:Java逻辑运算符
  • 当位移数为变量类型int(32bit)的倍数时,>>>和>>和<<得到的结果是自身;位移数可为负数,没看懂位移规律。

参考:

  • 百度百科|运算符
  • 菜鸟教程|Java运算符

你可能感兴趣的:(JAVA)