add/sub without +, –

同事問到的一題,不用加減法來計算加減法,當然是使用bit operation來操作,這題的想法主要是處理進位問題。

這邊只用recursive來處理,將進位的結果再加回去。

但須注意recursive可能的深度,避免function call stack overflow。(但以32bit整數加法來說 最多呼叫32次)。 事實上此處的recursive是在最尾端(tail recursive),所以在有處理tail call elimination的語言或是compiler有處理tail call optimization則不需擔心深度問題

#include <iostream>

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

int sub(int a, int b)
{
 int r = a ^ b;
 int c = (r & b) << 1;
 if(!c) return r;
 return sub(r, c);
}

int main()
{
 std::cout << add(-2, 34) << "," << sub(-2, 34) << std::endl;
 return 0;
}
This entry was posted in Brainstorming. Bookmark the permalink.

Leave a Reply