鍋あり谷あり

テーマを決めずに適当に書いています。

加算と減算

加算と減算を、所謂ビット操作のみで実現するというお題でプログラムを書いてみた。

int addbybitop( int a, int b )
{
  while( a&b ){
    int c = a^b;
	b = (a&b)<<1;
	a = c;
  }
  return a|b;
}

int subbybitop( int a, int b )
{
  while( b ){
    int c=b;
	b=(b&~a)<<1;
	a^=c;
  }
  return a;
}

繰り上がりの計算のためにループが要る。最悪、intのビット数の回数まわると思う。
ニブルごとにまとめて処理したら速くなるのかなとか、加算表を持ったら速いのかもとかいろいろ思ったが、とりあえず素朴な実装で。
加算の方で、a&b が二回行われているのがちょっと悔しいんだが、変数をもう一つ入れて a&b を一回にしてもそんなに変わらんかと思ってるので二回使ったままにしておいた。
乗算はともかく、除算はめんどくさそう。

まあしかし。
スタックを使って関数呼ぶんだから、加算減算のない世界で動くようにC言語コンパイルするのは無理なのかなとも思う。