题目解析:
题目链接: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;
}
};
搜了一下其他大神的做法,,发现自己真实见识短浅。用异或求得不带进位的和,然后将进位再相加,厉害。