一、位运算
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);
不用判断语句,求整数绝对值;
