字面量的八进制和十六进制
以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); } }