足し算を使わずに足し算する

足し算を使わずに足し算をするぜ、何を言っているのかわから(ry

まずはこのC言語で書かれた関数を見てください。

int add(int a, int b)
{
    while (b != 0)
    {
        int c = (a & b) << 1;
        a ^= b;
        b = c;
    }
    return a;
}

はい。この関数では足し算(演算子)を使わずに、ビット演算とループだけで足し算(加算)を実現しています。いわゆる全加算器ってやつで、これと同じ事が電気回路的に行われるのがCPUにおける足し算(演算子)です。

ざっくり解説しますと、一時変数cには各桁のキャリーを計算しています。キャリーはこんな真偽値表なので、

abc
000
010
100
111

実質ビットandになります。上記のコードではビットシフトして一つ上のビットに足し込んでます。

a には足し算後のキャリーを除いたビットをいれてて、それはこんな真偽値表になりますのでxorビット演算です。

abnew a
000
011
101
110

で、あとはこの工程をキャリーがなくなるまで繰り返せば足し算になっている、というわけです。

これを見ていると、足し算という算数・数学的な操作も特別なものではなく、過程はどうであれただの関数・操作の1つにすぎないということがよくわかります。まぁ今時、足し算演算子を使わないのは馬鹿みたいですが、考え方の1つとして知っておくのは良いでしょう。