1、位运算
必备基础知识
- 在计算机中都是以二进制数存储的,对于相应的二进制数,有位运算,这里是针对数值的二进制形式。
与运算 &
public class Main {
public static void main(String\u005B\u005D args) {
byte a = 74;
byte b = 50;
System.out.println(a&b);
}
}
- 这里的运算规则位两个数1或者0,都为1时结果为1,否则为0。最后结果就是0000 0010为2。
或运算 |
public class Main {
public static void main(String\u005B\u005D args) {
byte a = 74;
byte b = 50;
System.out.println(a|b);
}
}
- 这里面时两个数都为0时结果为0,否则为1。结果是0111 1010。结果是122。
异或 ^
public class Main {
public static void main(String\u005B\u005D args) {
byte a = 74;
byte b = 50;
System.out.println(a^b);
}
}
- 两个数相同结果为0,否则为1。结果0111 1000。结果是120。
取反 ~
public class Main {
public static void main(String\u005B\u005D args) {
byte a = 74;
System.out.println(~a);
}
}
- 包含符号为各位取反,结果为:1011 0101.。为-75。
左移 <<
public class Main {
public static void main(String\u005B\u005D args) {
byte b = (byte) (a<<3);
System.out.println(b);
}
}
- 前三位丢失,后五位向前移三位,最后三位补领。这里的第一位是符号位。结果为80。
右移动 >>
public class Main {
public static void main(String\u005B\u005D args) {
byte a = 74;
byte b = (byte) (a>>4);
System.out.println(b);
}
}
public class Main {
public static void main(String\u005B\u005D args) {
byte a = -74;
byte b = (byte) (a>>4);
System.out.println(b);
}
}
-
右移对于无符号类型强制补0,对于有符号类型续补符号位。
-
无符号右移( >>> )(没有无符号左移( <<< ))
-
无符号右移,忽略符号位,空位都以0补齐>>> 与>>唯一的不同是它无论原来的最左边是什么数,统统都用0填充。
于java对乘法运算的优化
- 位运算是高效的运算方法,对于左移和右移只不过是对二进制数的乘2的倍数或者除2的倍数。
- 在计算机中内部处理123 * 237是如何计算的呢,难道是123个237相加?答案是否定的,因为如果这么计算的话,计算机处理大批量数据的时候就会出现卡顿,而我们用java程序计算时实际上调用的是计算机的位运算。
123 * 237
=123 * 128 + 123 * 64 + 123 * 32 + 123 * 8 + 123 * 4 + 123 * 1
=123 << 7 + 123 << 6 + 123 << 5 + 123 << 3 + 123 << 2 +123
这样计算就快了很多,也是咱们java程序对计算机的乘法的优化。