2007-11-16 (金)
*0,-1,-1,-1,0,1,1,1
少し前のサークル中にSafiiが考えていた問題.分岐や除算を使わずに,上記数列を作るということらしい.テーブル作れば良いじゃん…というのは駄目らしい.
そのときに書いたコードがこれ.そろそろHDDから消したくなった(というか消してしまって書き直した)ので,ここに載せておきます.
#include <iostream> using namespace std; int main() { int i,j; for (i=0;i<8;i++) { j = ((i|i>>1)&1) * ((i>>1&2)-1); cout << j << endl; } return 0; }
乗算は使ってしまったけど,あまり複雑にしても仕方なさそうなので,こんな感じでしょう.
Safiiとsangoは少し悩んでいたみたいですが,この数列が(0,1,1,1,0,1,1,1)と(-1,-1,-1,-1,1,1,1,1)の積であると認識できれば,あとは対応付けたい 0~7 の各ビットを見ながら適当に調節すれば,上記の式はすぐに出てくると思います.