位运算效率最高!
异或 ^
小应用:数据加密解密
一个数异或另一个数两次,则还原
A^B^B = A
A^B --->加密 C^B = A --->解密
左移 <<
左移n位等效于 乘以2的n次幂 , 3<<2 = 3*2*2
右移 >>
右移一位等效于 除以2, 8>>2 = 8/2/2
被移动的高位用原来的高位来补,原来是0就用0补,是1就用1补,保证符号位不变
无符号右移动 >>>
>>>与>>的区别:
不论高位是0还是1,都用0来补高位。
小应用
不使用第三变量,交互2个数的值
第一种方案,异或
public static void main(String[] args) {
int a = 3;
int b = 5;
System.out.println("a="+a);
System.out.println("b="+b);
a = a ^ b;
b = a ^ b; // b = (a ^ b) ^ b = a的原始值;
a = a ^ b; // a = (a ^ b) ^ a = b的原始值;
System.out.println("a="+a);
System.out.println("b="+b);
}
第二种方案,求和,存在超过数据类型范围的可能
public static void main(String[] args) {
int a = 3;
int b = 5;
System.out.println("a="+a);
System.out.println("b="+b);
a = a + b;
b = a - b;// b = (a+b)-b = a的原始值
a = a - b;// a = (a+b)-a = b的原始值
System.out.println("a="+a);
System.out.println("b="+b);
}
第三种方案,求差
public static void main(String[] args) {
int a = 3;
int b = 5;
System.out.println("a="+a);
System.out.println("b="+b);
a = a - b;
b = a + b; // b = (a-b)+b = a的原始值
a = b - a; // a = a-(a-b) = b的原始值
System.out.println("a="+a);
System.out.println("b="+b);
}