- 题目:求两个数的和,不能使用加减法
- 难度:Easy(这道题对我来说不是Easy,位运算有太强大的功能了)
- 思路:不能用加减法,于是考虑用位运算
- 代码:
public class Solution {
public int getSum(int a, int b) {
int result = 0;
int carry = 0;
while(b != 0){
carry = a&b;
a = a^b;
b = carry<<1;
}
return a;
}
}
延伸:
- 减法(a-b)
// Iterative
public int getSubtract(int a, int b) {
while (b != 0) {
int borrow = (~a) & b;//此处也可以换成(borrow = a & ((~b) + 1))因为 a-b = a+(-b) -b可以用补码表示
a = a ^ b;
b = borrow << 1;
}
return a;
}
2.乘法(还没明白)
public int getProduct(int a, int b) {
if (a==0 || b==0) return 0;
int result = 0;
while (b != 0) {
if ((b & 1) != 0) {
result = getSum(a,result);
}
a <<= 1;
b >>>= 1;
}
return result;
}
3.判断数的奇偶性
和1进行与运算,如果运算结果为1,则说明数子的二进制表示的最后一位为1,即该数为奇数
public boolean isOddNumber(int n){
return (n & 1) != 1;
}
4.不用临时变量交换两个数(面试常考)
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。
public void change(int a, int b){
a = a^b;
b = a^b;
a = a^b;
}
5.求两个整数的平均数
public int getAverage(int x, int y){
return ((x ^ y) >> 1) + (x & y);
/*(x^y) >> 1得到x,y其中一个为1的位并除以2,
x&y得到x,y都为1的部分,加一起就是平均数了*/
}
位运算的学习资料:
http://blog.csdn.net/zmazon/article/details/8262185
http://www.matrix67.com/blog/archives/263