相对于其他的任何运算都要快,数字转化为二进制
&:按位与
只有两个操作数对应位同为1时,结果为1,其余全为0. (或者是只要有一个操作数为0,结果就为0)。
数字m | 0 | 0 | 1 | 1 |
---|---|---|---|---|
数字n | 0 | 1 | 0 | 1 |
m&n | 0 | 0 | 0 | 1 |
运用:得出某个数字是不是奇偶数
int n=5;
String result=(n & 1) == 1?"奇数":"偶数";
|:按位或
只有两个操作数对应位同为0时,结果为0,其余全为1.(或者是只要有一个操作数为1,结果就为1)。
数字m | 0 | 0 | 1 | 1 |
---|---|---|---|---|
数字n | 0 | 1 | 0 | 1 |
m|n | 0 | 1 | 1 | 1 |
~:按位非
取二进制的另一个数字
数字m | 0 | 1 |
---|---|---|
~m | 1 | 0 |
^:按位异或
两个数字不一样结果才是1否则是0
数字m | 0 | 0 | 1 | 1 |
---|---|---|---|---|
数字n | 0 | 1 | 0 | 1 |
m^n | 0 | 1 | 1 | 0 |
运用:不使用任何运算符和第三变量交换两个值
int a=2,b=3;
a=a^b;//a=1
b=a^b;//b=2
a=a^b;//a=3
«:左位移运算符
符号位不变,低位补0。如:2«2结果为8。
>>:右位移运算符
符号位不变,并用符号位补溢出的高位。如:-6»2结果为-2。
«<:无符号右移运算符
低位溢出,高位补0。注意,无符号右移(»>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-1»>1结果为2147483647。
除了使用-1»>1能得到Integer.MAX_VALUE,以下的也能得到同样的结果:
//maxInt
System.out.println(~(1 << 31));
System.out.println((1 << -1)-1);
System.out.println(~(1 << -1));
负数的二进制表示
原码 绝对值的二进制表示
反码 所有位取反
补码 反码加1即为负数的二进制表示
例如 -6
原码 00000110
反码 11111001
补码 11111010