これは、ハードウェアが加算を実装する方法です。ビットの加算の結果は、ビットの排他的論理和 ( ^
C++ の演算子) です。これはあなたが得るものですsum
。ただし、これは下位ビットからのキャリーを考慮していません。キャリーアウトは、ビット (&
演算子) の and であり、 の初期値が得られますcarry
。しかし、ビット n のキャリーアウトはビット n + 1 のキャリーインなので、左にシフトし、ビット n をビット n + 1 に移動して追加します。
キャリーインを追加する前の結果 (ビットレベル) が 1 で、キャリーインが 1 の場合、キャリーアウトも発生するため、再帰を使用して追加します。
再帰が終了する理由はもう少し微妙です (もちろん、ハードウェア バージョンでは再帰は行われず、ロジックが追加されます)。これは、元の値を考慮することで最も簡単に評価できます。
a b carry_in sum carry_out
0 0 0 0 0
1 0 0 1 0
0 1 0 1 0
1 1 0 0 1
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 1 0 1
(「合計」列はa ^ b
、キャリーを除いた の結果です。)
最初の再帰呼び出しでは、b のビット 0 は 0 になります (これは下位ビットの Carry_in を表し、1 がないため、または<<
ビット n の Carry_out をビット n の Carry_in に移動する のため) + 1)。そしてもちろん、ビット 0 の Carry_in は 0 になります。そのため、最初の再帰呼び出しのビット 0 では、最初の 2 行だけが発生する可能性があります。つまり、carry_out は発生せず、次の再帰では、最初の 2 行だけがビット 0 と 1 に関連します。つまり、各再帰は、伝達されたキャリーから 1 つのセット ビットを効果的に削除します。キャリーは最終的に 0 になる必要があります。また、パラメータ b として伝播されるため、パラメータ b は最終的に 0 になる必要があります。