Java定义的位运算,应用于整数类型(int),长整型(long),短整型(short),字符型(char)和字节型(byte)等类型。
计算原理是将上述类型转换成二进制数,然后再按位计算。
假设
a = 6;(二进制:0110)
b = 2;(二进制:0010)
一、操作符(&)
1、原理:如果都是1则为1,否则为0
a = 0110
b = 0010
------------------------------
a&b = 0010 (结果为2)
二、操作符(|)
1、原理:如果有一个为1则为1,否则为0
a = 0110
b = 0010
------------------------------
a|b = 0110 (结果为6)
三、操作符(^)
1、原理:相同为0,不同为1
a = 0110
b = 0010
------------------------------
a^b = 0100 (结果为4)
2、加密应用
一个数按位异或其他数两次,等于这个数本身(一般用于简单的加密运算)
上面c = a ^ b = 0100(结果为4),得到的结果c再异或b一次,结果:
c = 0100
b = 0010
------------------------------
c^b = 0110(结果为6,等同:a ^ b ^ b = a)
3、数据交换应用
最高效的交换两个整数(不能使用第三个变量)
a = a ^ b; // a = 6 ^ 2
b = a ^ b; // b = (6 ^ 2) ^ 2; b = 6;
a = a ^ b; // a = (6 ^ 2) ^ 6; a = 2;
四、操作符(<<)
1、原理:左移几位就是符号左边的数据乘以2的几次方。
6 << 1 = 12;等同:6 * 2(1) = 12;
6 << 2 = 24;等同:6 * 2(2) = 24;
五、操作符(>>)
1、原理:右移几位就是符号左边的数据除以2的几次方。对于高位出现的空位,原来高位是什么就用什么补这个空位。
6 >> 1 = 3;等同:6 / 2(1) = 3;
6 >> 2 = 1;等同:6 / 2(2) = 1;
五、操作符(>>>)
1、原理:无符号右移几位就是符号左边的数据除以2的几次方。对于高位出现的空位,无论原高位是什么,空位都用0补。
6 >>> 1 = 3;等同:6 / 2(1) = 3;
6 >>> 2 = 1;等同:6 / 2(2) = 1;