一、位运算

1.1 基础知识

  • 在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这意味着,可以使用屏蔽技术获得整数中的各个位;
  • &|^异或 ~非;
  • >><< 运算符将二进制位进行右移或者左移操作;
  • >>> 运算符符号位跟着移动;>> 运算符符号位不移动,没有 <<< 运算符;
  • 对于 int 型,1 << 351 << 3 是相同的,而左边的操作数是 long 型时需要对右侧操作数模 64;
  • 与:都为1,其结果为1,或:有一个为1 结果为1,异或:二者不同时,结果为1。
  • 计算机使用补码来保存数据,正数的补码、原码、反码都相同,负数的补码为其原码符号位不变取反再加一,反码为原码符号位不变其余位取反。

    若用8位来表示 -1 的原码为:1000 0001

    1. 反码为:1111 1110
    2. 补码为:1111 1111

    所以有 -1 <<< x 都为 -1,x可以表示任何数。

1.2 奇巧淫技

  • 判断奇偶:x & 1 为 1 则为奇数,为 0 则为偶数;
  • 获取二进制位是 1 还是 0,见如下代码;

    1. /**
    2. * 计算一个整型数字的二进制表示
    3. *
    4. * @param x 待表示的整型数字
    5. * @return 二进制表示字符串
    6. */
    7. public static String int2BitString(int x) {
    8. StringBuilder sb = new StringBuilder();
    9. for (int i = 0; i < 32; i++) {
    10. String bit = (x & (1 << (31 - i))) == 0 ? "0" : "1";
    11. sb.append(bit);
    12. if ((i + 1) % 4 == 0) sb.append(" ");
    13. }
    14. return sb.toString();
    15. }
  • 交换两个整数变量的值(异或);

    1. int a = 10, b = 23;
    2. System.out.printf("a = %d, b = %d\n", a, b);
    3. int c = a ^ b;
    4. a = c ^ a;
    5. b = c ^ b;
    6. System.out.printf("a = %d, b = %d\n", a, b);
  • 不用判断语句,求整数绝对值;