ソードはオファー65を指します。加算(ビット演算の適用)のために加算、減算、乗算、除算を行う必要はありません。

2021年2月10日水曜日、天気は良いです[過去を嘆いたり、現在を無駄にしたり、未来を恐れたりしないでください]


この記事の内容


1.はじめに

ソードフィンガーオファー65。足し算、引き算、掛け算、割り算の必要はありません。

ここに画像の説明を挿入

2.解決策

+ bはに変換され、非+キャリーキャリー、そのように第二の加数まで0に変換されているように、加算器として使用することができません。現時点では、最初の加数が最終結果です。

class Solution {
    
    
public:
    int add(int a, int b) {
    
    
    	// 当第二个加数 b 变成0时,第一个加数 a 就是最终结果
        while(b!=0){
    
    
            int sum = (unsigned int)(a & b) << 1;
            // 或 int sum = (a & b & INT_MAX) << 1;
            // a 是第一个加数
            a = a ^ b;
            // b 是第一个加数
            b = sum;
        }
        return a;
    }
};

注: LeetCodeコンパイラーのため、負の数のままにすることはできません。負の数にする必要があります。左側の最大符号ビットは0である必要があるためint sum = (a & b) << 1;、方法はありません。次の2つの解決策があります。

  1. 負の数を整数に変換します。つまり、add (unsigned int)を実行すると、左に移動できます。
  2. 最上位のシンボルは1であり、渡す方法がないため、0に変更するだけで十分です。方法は上位0x7fffffff(つまり、INT_MAXの値)と比較することで、最上位ビットは0になります。

参照

「ソードフィンガーオファー第2版」

https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/solution/mian-shi-ti-65-bu-yong-jia-jian-チェンチュズオジ-7 /

おすすめ

転載: blog.csdn.net/m0_37433111/article/details/113785941