Java位运算

计算机位运算

Posted by JovenHe on April 2, 2018

相对于其他的任何运算都要快,数字转化为二进制

&:按位与

只有两个操作数对应位同为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