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