字面值的八进制和十六进制
以 0
开头的整数为八进制
- 05 就是十进制的 5
- 011 就是十进制的 9
以 0x
开头的整数位十六进制
- 0xf 就是十进制的 15
- 0x11 就是十进制的 17
int a = 05;
int b = 011;
int c = 0xF;
int d = 0x11;
System.out.println(a); // 5
System.out.println(b); // 9
System.out.println(c); // 15
System.out.println(d); // 17
按位运算符
- 按位并(AND):
&
- 按位或(OR)::
l
- 按位异或(XOR):
^
- 按位取反:
~
// 二进制的 1111 1000
int a = 0xF8;
// 二进制的 1111 0100
int b = 0xF4;
// 二进制的 1111 1111
int c = 0xFF;
System.out.println(a & b); // 240
System.out.println(a | b); // 252
System.out.println(a ^ b); // 12
System.out.println(~c); // -256
位移运算符
>>
:符号位不动,其余位右移,符号位后边正数补0,负数补1。又称带符号右移>>>
:符号位一起右移,左边补0,又称无符号右移<<
:左移,右边补0。左移没有带符号位一说,因为符号位在最左侧
注意:位运算符不会改变变量的值。
int a = 0x400;
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);
int base = 1;
// 0001
int is_student_mask = base;
// 0010
int is_programmer_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 isProgrammer = (data & is_programmer_mask) != 0;
System.out.println(isProgrammer);
// 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);
int a = 0x400;
int b = 0xF4;
int c = 0xFF;
System.out.println(a >> 2);
System.out.println(~a);
System.out.println(a | 0x8);
System.out.println(a);