著者: Zhai Tianbao Steven
著作権表示: 著作権は著者に属します。商業的転載の場合は、許可について著者に連絡してください。非商業的な転載の場合は、出典を示してください。
タイトル説明:
2 つの整数の合計を求める関数を作成します。関数本体では 4 つの算術演算子 +、-、*、/ を使用しないことが必要です。
データ範囲:両方の数値が−10≦n≦1000を満たす
アドバンスト:空間計算量O(1)、時間計算量O(1)
例:
入力:
1,2
戻り値:
3
問題解決のアイデア:
この問題はビット演算について調べます。問題を解決する 2 つの方法。
1) ビット操作 - 非再帰的
さらに、同じビットについて、両方が 0 の場合は 0、1 と 0 がある場合は 1、1 が 2 つある場合、現在のビットは 0 でキャリー 1 があります。排他的 OR 演算 ^ は 2 つの数値の非キャリーを取得でき、AND 演算後の左シフト 1 は 2 つの数値のキャリーを取得できます。非キャリーとキャリーは別の XOR 演算と AND 演算を実行し、キャリーがない場合は、両者の加算に相当し、新たなキャリーが現れた場合は、キャリーが消えるまで上記の操作を繰り返します。
2) ビット演算 - 再帰
再帰的操作は while ループを再帰的に実行することと等価であり、原理は同じです。
テストコード:
1) ビット操作 - 非再帰的
class Solution {
public:
int Add(int num1, int num2) {
// add表示进位值
int add = num2;
// sum表示总和
int sum = num1;
// 当不再有进位的时候终止循环
while(add != 0) {
// 将每轮的无进位和与进位做异或运算
int temp = sum ^ add;
// 进位通过用与运算左移1产生的
add = (sum & add) << 1;
// 更新
sum = temp;
}
return sum;
}
};
2) ビット演算 - 再帰
class Solution {
public:
int Add(int num1, int num2) {
// 递归地求和
return num2 ? Add(num1 ^ num2, (num1 & num2) << 1) : num1;
}
};