Java中的位运算符

字面量的八进制和十六进制

以0开头的整数为八进制

  • 05就是5 5*8^0=5
  • 011就是9 1*8+1*8^0=8+1=9

以0x开头的整数为十六进制

  • 0xF就是15
  • 0x11就是17 1*16+1*16^0=16+1=17

 

public class LiteralNumber {
    public static void main(String[] args) {
        int a = 05;
        int b = 011;
        int c = 0xF;
        // 16进制的数值写成:0x或者0X都行
        int d = 0X11;

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

 

 

按位运算符

  • 按位并 &(and)
  • 按位或 |(or)
  • 按位异或 ^(xor)
  • 按位取反 ~(~)
public class BitCalc {
    public static void main(String[] args) {
        // 二进制的 1111 1000
        int a = 0xF8;
        // 二进制的 1111 0100
        int b = 0xF4;
        // 二进制的 1111 1111
        int c = 0xFF;

        System.out.println(a&b);
        System.out.println(a|b);
        System.out.println(a^b);

        System.out.println(~c);
    }
}

 

位移运算符

  • >> :符号不动,其余右移,符号位后面正数补0,负数补1,又称带符号右移(效果是每移动一位,数值上会减少为原值绝对值的一半。但是符号是不变的。)
  • >>> :符号位一起右移,左边补0,又称无符号位右移(如果原值为负数,那么右移会使数值变得非常大;如果原值为正数,那么效果同上面的>>运算符一样。)
  • << :左移,右边补0,左移没有符号位一说,因为符号位在最左侧。(效果是每移动一位,数值上会增加为原值绝对值的一倍。但是符号是不变的。)
  • 位运算符不会改变原变量的值。
public class BitShift {
    public static void main(String[] args){
        int a = 0x400; // 二进制为1024
        System.out.println(a);
        System.out.println(a >> 1); // 右移一位减少一半
        System.out.println(a >> 2);

        System.out.println(a << 1); // 左移一位增加一倍
        System.out.println(a << 2);

        int b = -0x400;
        System.out.println(b);
        System.out.println(b >> 1); // 带符号右移一位绝对值同样减少一半,然后带上符号(-)
        System.out.println(b >> 2);

        System.out.println(b << 1); // 带符号左移一位,绝对值增加一倍,然后带上符号(-)
        System.out.println(b << 2);

        System.out.println(b >>> 1);
        System.out.println(b >>> 2);
    }
}

 

位运算符的用处

按位运算符:掩码(mask)

位移运算符:右移高效除以2(正数)

public class BitOprtUsage {
    public static void main(String[] args) {
        // 掩码操作
        int base = 1;
        // 0001
        int is_student_mask = base;
        // 0010
        int is_programer_mask = base << 1;
        // 0100
        int is_driver_mask = base << 2;
        // 1000
        int is_painter_mask = base << 3;

        // 二进制是0101
        int data = 5;

        // 0101 & 0001 = 1
        boolean isStudent = (data & is_student_mask) != 0;
        System.out.println(isStudent);

        // 0101 & 0010 = 0
        boolean isProgramer = (data & is_programer_mask) != 0;
        System.out.println(isProgramer);

        // 0101 & 0100 = 0100
        boolean isDriver = (data & is_driver_mask) != 0;
        System.out.println(isDriver);

        // 0101 & 1000 = 0
        boolean isPainter = (data & is_painter_mask) != 0;
        System.out.println(isPainter);
    }
}
posted @ 2019-12-27 23:23  见嘉于世  阅读(316)  评论(0编辑  收藏  举报