最新

Miyako Shogi System

コツコツ改良、へこたれない
2014| 1|
2013| 12|
2012| 01| 02| 04| 05| 06| 07| 08| 09| 10|
2011| 01| 02| 03| 04| 05| 07| 08| 10| 11| 12|
2010| 02| 03| 06| 07| 08| 09| 10| 12|

2012/09/22

bitboardによる手生成の実装方法

bitboardによる銀の移動手のコード例としては、

org=p->bitboard[BLACK][P_GIN];  // 先手の銀のbitboard
while ( test128(org) ) {  // 駒がある
  from=bit_pop1st(&org);  // 駒位置
  and128(t,attack_gin_b[from],target);  // 先手銀の利きのbitboardを押し付ける
  while ( test128(t) ) {  // 利きのある数
    to=bit_pop1st(&t); // 移動先の位置
    pin_check()
    手の格納
  }
}

というふうになるであろう。上記コードにおいて、test128()はbitboardがゼロか非ゼロかをテストする関数である。

bit_pop1stはbitboardのLSBから立っているビット位置を返し、そのビットをクリアする関数である。32ビット版では次のようなコードとなっている。

bit_pop1st(BITBOARD *x)
{
int pos;
  if ( x->l ) {
    pos=__builtin_ctz(x->l);
    x->l&=(x->l-1);     // reset bit
    return pos;
  }
  else if ( x->m ) {
    pos=__builtin_ctz(x->m)+32;
    x->m&=(x->m-1);     // reset bit
    return pos;
  }
  pos=__builtin_ctz(x->h)+64;
  x->h&=(x->h-1);     // reset bit
  return pos;
}

_builtin_ctzはLSB側から'1'のビット位置を返す関数。x86ではbsf命令で展開される。

リンクはご自由に (Miyako Shogi System Kyoto Japan)

ダウンロードのページ

Lighttpd

DreamPlug