+を使わずにAdd関数を作成する方法

下のコードが実際に足し算として機能するのか、8ビット計算で試してみた

int add(int a, int b)

{

    while (b != 0)

    {

        int c = (a & b) << 1;

        a ^= b;

        b = c;

    }

    return a;

}

 

引用元:足し算を使わずに足し算する — KaoriYa

参考:ビット演算 - Wikipedia

 

例1 44+33の場合

a= 44

b =33

 

1回目のループ

a = 00101100

b = 00100001

 

(a & b) << 1で、And判定してさらに左に1ビットシフト

00100000

c= 01000000

 

a^ = bでXOR判定

a = 00001101

b = 01000000

 

2回目のループ

a、bともに1のダブりがないので、全部0に

c = 00000000

 

a^ = bでXOR判定

a = 01001101 => 64+8+4+1 = 77

b = 00000000

 

で、この後にaが帰るから・・・確かに足し算後の値になる。

肝はcでの繰上げなんだな。

 

もう一こ例をば

 

例2 127+127の場合

01111111 => 127

01111111 => 127

 

c= 11111110

 

a = 00000000

b = 11111110

 

c = 00000000

 

a = 11111110 => 254

まじだ・・・すげえな、これ