zoukankan      html  css  js  c++  java
  • 常用位运算

    1. 判断一个整数是否为偶数

    boolean isEven (int n) {
        return (n & 1) == 0;
    }
    
    // 下面的代码用来判断一个整数是否为奇数
    boolean isOdd (int n) {
        return (n & 1) == 1;
    }

    2. 交换两个整数

    int a = 6;
    int b = 1;
    a ^= b;
    b ^= a;
    a ^= b;

    3. 求一个整数的绝对值

    int i = a >> 31;
    int abs = i == 0 ? a : (~a + 1));

    4. 变换符号

    int a = 45;
    int b = -9;
    System.out.println(~a + 1);
    System.out.println(~b + 1);

    5. 求两数平均值

    (x & y) + ((x ^ y) >> 1);

    6. 取int型变量的第k位

    a >> (k - 1) & 1;

    7:取末k位

    a & ((1 << k) - 1);

    总结

        功能                    示例                    位运算
    去掉最后一位          (101101 -> 10110)             x >> 1
    在最后加一个0         (101101 -> 1011010)           x << 1
    在最后加一个1         (101101 -> 1011011)           x << 1 + 1
    把最后一位变成1       (101100 -> 101101)            x | 1
    把最后一位变成0       (101101 -> 101100)            x | 1 - 1
    最后一位取反          (101101 -> 101100)            x ^ 1
    把右数第k位变成1      (101001 -> 101101,k=3)        x | (1 << (k - 1))
    把右数第k位变成0      (101101 -> 101001,k=3)        x & ~ (1 << (k - 1))
    右数第k位取反         (101001 -> 101101,k=3)        x ^ (1 << (k - 1))
    取末三位              (1101101 -> 101)              x & 7
    取末k位               (1101101 -> 1101,k = 5)       x & ((1 << k)-1)
    取右数第k位           (1101101 -> 1,k = 4)          x >> (k-1) & 1
    把末k位变成1          (101001 -> 101111,k = 4)      x | (1 << k-1)
    末k位取反             (101001 -> 100110,k = 4)      x ^ (1 << k-1)
    把右边连续的1变成0    (100101111 -> 100100000)      x & (x + 1)
    把右起第一个0变成1    (100101111 -> 100111111)      x | (x + 1)
    把右边连续的0变成1    (11011000 -> 11011111)        x | (x - 1)
    取右边连续的1         (100101111 -> 1111)           (x ^ (x + 1)) >> 1
    去掉右起第一个1的左边 (100101000 -> 1000)           x & (x ^ (x - 1))
    判断奇数              (x & 1) == 1
    判断偶数              (x & 1) == 0
  • 相关阅读:
    mysql字节乱码问题之解决方法
    tracert nbtstat nslookup arp指令用法及示例
    Java ThreadLocal示例及使用方法总结
    C# Undo Redo
    自定义过滤器
    C#粘贴复制数据库中的内容
    分布式数据同步
    创建路径(c#)动态分段
    构建网络数据集(c#)
    创建一个栅格图层
  • 原文地址:https://www.cnblogs.com/itsone/p/15767154.html
Copyright © 2011-2022 走看看