leetcode: 371. Sum of Two Integers

题目解析:

题目链接:https://leetcode.com/problems/sum-of-two-integers/description/

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.

解题思路:

题中规定了不能使用加减运算符号,因此只能选择按位运算了。先将两个整数的所有二进制位存入到两个数组bita, bitb中。在这里用到了(a&1)==0则最后一位为0,否则为1。这是化用了判断是否为偶数的做法。另外参考网上大神们的经验,将一个用来判断的数 m 不断地 m=m<<1 来避免将a = a>>1右移的时候,因为a为负数而导致出现0xffffffff出现死循环。原因是计算机二进制用补码表示负数,最高位保持为1,右移的时候原最高位的1不断右移,在最高位不断补1,导致出现0xffffffff。

然后,根据两个整数得到的数组进行遍历,具体相加的过程,如果两个数组当前值bita[i]、bitb[i]以及进位符carr得出为1,和的对应为置为1,操作依然为上面用 m = m <<1。最后的时候判断是否有进位产生,若有,在最高非零位(除符号位)补1。代码如下:

class Solution {
public:
    int getSum(int a, int b) {
        int m = 1;
	//a = a & m;
	int result = 0;
	vector<int> bita;
	vector<int> bitb;
	
	while (m)
	{

		if ((a & m) == 0)
			bita.push_back(0);
		else
			bita.push_back(1);
		if ((b & m) == 0)
			bitb.push_back(0);
		else
			bitb.push_back(1);
		m = m << 1;

	}
	int carr = 0;
	m = 1;
	for (int i = 0; i < 32; i++)
	{

		int temp = carr;

		if (carr == 1 && bita[i] == 1)
		{
			carr = 1;
			temp = 0;
		}
		else if (carr | bita[i] == 1)
		{
			carr = 0;
			temp = 1;
		}
		else if (carr | bita[i] == 0)
		{
			carr = 0;
			temp = 0;
		}

	
		if (temp == 1 && bitb[i] == 1)
		{
			carr = 1;
			temp = 0;
		}
		else if (temp | bitb[i] == 1)
		{
			temp = 1;
		}
		else if (temp | bitb[i] == 0)
		{
			temp = 0;
		}
	
                if (temp == 1)
                        result = result | m;
                m = m << 1;
         }
        if (carr == 1)
             result = result | m;
        return result;
    }
};

搜了一下其他大神的做法,,发现自己真实见识短浅。用异或求得不带进位的和,然后将进位再相加,厉害。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值