LeetCode#371. Sum of Two Integers(位运算)

  • 题目:求两个数的和,不能使用加减法
  • 难度: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;
    }
}
  • 延伸:

    1. 减法(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值