一、位运算
1.1 基础知识
- 在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这意味着,可以使用屏蔽技术获得整数中的各个位;
&
与|
或^
异或~
非;>>
和<<
运算符将二进制位进行右移或者左移操作;>>>
运算符符号位跟着移动;>>
运算符符号位不移动,没有<<<
运算符;- 对于
int
型,1 << 35
与1 << 3
是相同的,而左边的操作数是long
型时需要对右侧操作数模 64; - 与:都为1,其结果为1,或:有一个为1 结果为1,异或:二者不同时,结果为1。
- 计算机使用补码来保存数据,正数的补码、原码、反码都相同,负数的补码为其原码符号位不变取反再加一,反码为原码符号位不变其余位取反。
若用8位来表示 -1 的原码为:1000 0001
反码为:1111 1110
补码为:1111 1111
所以有 -1 <<< x 都为 -1,x可以表示任何数。
1.2 奇巧淫技
- 判断奇偶:
x & 1
为 1 则为奇数,为 0 则为偶数; 获取二进制位是 1 还是 0,见如下代码;
/**
* 计算一个整型数字的二进制表示
*
* @param x 待表示的整型数字
* @return 二进制表示字符串
*/
public static String int2BitString(int x) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 32; i++) {
String bit = (x & (1 << (31 - i))) == 0 ? "0" : "1";
sb.append(bit);
if ((i + 1) % 4 == 0) sb.append(" ");
}
return sb.toString();
}
交换两个整数变量的值(异或);
int a = 10, b = 23;
System.out.printf("a = %d, b = %d\n", a, b);
int c = a ^ b;
a = c ^ a;
b = c ^ b;
System.out.printf("a = %d, b = %d\n", a, b);
不用判断语句,求整数绝对值;