常用位运算

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

 

posted @ 2022-01-05 15:10  木狼  阅读(48)  评论(0编辑  收藏  举报