まずはこのC言語で書かれた関数を見てください。
int add(int a, int b)
{
while (b != 0)
{
int c = (a & b) << 1;
a ^= b;
b = c;
}
return a;
}
はい。この関数では足し算(演算子)を使わずに、ビット演算とループだけで足し算(加算)を実現しています。いわゆる全加算器ってやつで、これと同じ事が電気回路的に行われるのがCPUにおける足し算(演算子)です。
ざっくり解説しますと、一時変数cには各桁のキャリーを計算しています。キャリーはこんな真偽値表なので、
a | b | c |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
実質ビットandになります。上記のコードではビットシフトして一つ上のビットに足し込んでます。
a には足し算後のキャリーを除いたビットをいれてて、それはこんな真偽値表になりますのでxorビット演算です。
a | b | new a |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
で、あとはこの工程をキャリーがなくなるまで繰り返せば足し算になっている、というわけです。
これを見ていると、足し算という算数・数学的な操作も特別なものではなく、過程はどうであれただの関数・操作の1つにすぎないということがよくわかります。まぁ今時、足し算演算子を使わないのは馬鹿みたいですが、考え方の1つとして知っておくのは良いでしょう。