探索木のvalidatorを書こう!! その4

あと、is_move_validのソースコード上で

  // fromが81未満 == 盤面内の駒の移動
  if ( from < nsquare )
    {
      // 動かす駒
      piece_move = (int)I2PieceMove(move);
      if ( turn )
	{
	  // 後手ならば

	  // 移動元のところにあるのは後手の駒でなければならない
	  if ( BOARD[from] != -piece_move )       { return 0; }

	  // 移動先にある駒は、先手の駒か、0(空のマス)でなければならない。
	  if ( BOARD[to]   != (int)UToCap(move) ) { return 0; }
	}
      else {
	// 先手ならば

	  // 移動元のところにあるのは先手の駒でなければならない
	if ( BOARD[from] !=  piece_move )        { return 0; }
	  // 移動先にある駒は、後手の駒か、0(空のマス)でなければならない。
	if ( BOARD[to]   != -(int)UToCap(move) ) { return 0; }
      }

※ ソース上のコメントは私が追加しておきました。


UToCapというのは指し手を表現する構造体(32bit整数)から、捕獲した駒を取り出すためのマクロです。また、Bonanzaでは駒は、正の値が先手の駒、負の値が後手の駒、0だと駒がないことを表現するようになっています。


この -(int)UToCap(move) の部分がなかなか感慨深いわけです。ここでマイナスをつけることにより、
・UToCap(move)の値が0ならば0に
・駒があればUToCap(move)は正の値になりますが、そこにマイナス符号をつけることによって、後手の駒を表す値に
なるからです。

要するに、UToCapで駒種を得たあと(0の場合もある)、それを後手の駒に変換しているわけです。駒種が0(捕獲した駒なし)の場合、0(空白のマスを表現する)に変換されます。


この部分は、なかなかうまく出来ています。


これをもし、駒を無符号型で持つように設計していた場合どうなるでしょうか?(私はそういう設計でコードを書いています。)


つまり、私のコードは、

// 駒の定数定義。成は+8になるようにしておく
enum PieceEnum : Piece
{
  piece_empty = 0,	// 駒なし
  pawn,		// 歩    : 1
  lance,	// 香    : 2
  knight,	// 桂    : 3
  silver,	// 銀    : 4
  gold,		// 金    : 5
  bishop,       // 角    : 6
  rook,         // 飛    : 7
  king,         // 王    : 8
  pro_pawn,     // と   : 1+8 = 9
  pro_lance,    // 香成 : 2+8 = 10
  pro_knight,   // 桂成 : 3+8 = 11
  pro_silver,   // 銀成 : 4+8 = 12
  piece_null,   // 空き
  horse,        // 馬   : 6+8 = 14
  dragon,       // 龍   : 7+8 = 15

  piece_promote = 8,	// 成り になると +8
  piece_enemy = 16, // 敵の駒は + 16

  bad_piece = 32 , // エラーを表現する駒値
};

となっており、敵の駒(後手の駒)だと、値を+16するようになっています。


さて、問題です。私のように設計した場合、 -(int)UToCap(move) に相当する部分はどう書けるでしょうか?なるべく速いコードを求みます!


↓コメント欄で↓