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

boolean isEven (int n) {
    return (n & 1) == 0;
}

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

应用:统计一个int型数组中偶数的和:

int sumOfEvenValues(int[] array) {
    int sum = 0;
    for (int num : array)
        sum += num * (num & 1 ^ 1);
    return sum;
}

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. 取余运算:

对于 a % b,当b为2的n次方的时候,a % b 等价于 a & (b - 1)

7. 取int型变量的第k位:

a >> (k - 1) & 1;

运算顺序为先右移 k - 1位,再与1。

8:取末k位:

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

当结果长度不够时,应该在最左端加上相应的0就可以了。


总结:

    功能                    示例                    位运算
去掉最后一位          (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