Jianzhi Offer(C++)-JZ65: 加算、減算、乗算、除算を使用しない加算 (アルゴリズム ビット演算)

著者: 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;
    }
};

おすすめ

転載: blog.csdn.net/zhaitianbao/article/details/131852191