371. Sum of Two Integers(Leetcode)

题目

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

思路

位运算

假设a=010010, b=100111, 则a^b = 110101, 可以得到对应位为0,1和0,0相加的结果,忽略了1,1相加的情况;

那么就要看有木有1,1相加的对应位,与运算正好可以满足此需求。

a&b = 000010 ,说明倒数第二位相加后会产生进位,但是进位会进到倒数第三位上,故(a&b)<<1 可以得到是哪位有进位。

如果(a&b)<<1 为0了,说明已经没有进位,则a^b即为a+b的结果。

如果(a&b)<<1不为0,说明有进位,则继续将a^b和(a&b)<<1的结果进行异或和与,处理结果如上。

实现代码(C语言):

int getSum(int a, int b) {
    if(a == 0)
        return b;
    if(b == 0)
        return a;

    int tempA = 0;
    while(b)
    {
        tempA = a ^ b;
        b = (a & b) << 1;
        a = tempA;
    }
    return a;
}

位运算的其它用法

1.计算两个数的平均值:对于两个整数x,y,avg = (x+y)/2, 但是x+y有可能超出整数所能表示的数值的最大范围,我们又知道平均值肯定不会超出最大值的,故用位运算。

int average(int x, int y)   //返回X,Y 的平均值
  
  return (x&y)+((x^y)>>1);
}
2.判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
bool power2(int x)
{
  return ((x&(x-1))==0)&&(x!=0);
}
3.不用temp交换两个整数
void swap(int x , int y)
{
  x ^= y;
  y ^= x;
  x ^= y;
}
4.计算绝对值
int abs( int x )
{
  int y ;
  y = x >> 31 ;
  return (x^y)-y ;        //or: (x+y)^y
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值