Question: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+1,負數經過這樣的運算就變爲正數。補碼和原碼的轉換是同一表達式。
異或:如果a、b兩個值不相同,則異或結果爲1。如果a、b兩個值相同,異或結果爲0。相當於沒有進位的加法。
進位的實現:(a&b)<<1.有進位則向左移動一位,就是進位加。
Note:class域作用符對於靜態成員函數可以使用類作用域運算符::。對於非靜態成員函數必須要再定義A a;再a.function().
頭文件要和主函數的CPP文件放在一起,VS裏面不能全域查找。
VS註釋快捷鍵:Ctrl+k,Ctrl+c;消除註釋快捷鍵:Ctrl+k,Ctrl+u;
#pragma once
class Add {
public:
int getSum1(int a, int b);
int getSum(int a, int b) {
if (a < 0 && b < 0)//如果是負數就執行補碼運算
{
a = (~a + 1);
b = (~b + 1);
int neg=getSum1(a, b);
neg = ~neg + 1;
return neg;//補碼
}
else //不全是負數就執行該運算
{
return getSum1(a, b);
}
}
};
int Add::getSum1(int a, int b){
int xorab = a^b;
int carry = (a&b) << 1;
while (carry) {
xorab = a^b;
carry = (a&b) << 1;
a = xorab;
b = carry;
}
return xorab;
}
主函數:
#include<iostream>
#include"Add.h"
using namespace std;
int main() {
Add a;
int sum=a.getSum(1, -2);
cout << sum << endl;
}