常用位运算
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