/// <summary> /// 飛車の横の利き /// </summary> /// <param name="sq"></param> /// <param name="occupied"></param> /// <returns></returns> public static Bitboard RookRankEffect(Square sq, Bitboard occupied) { // 将棋盤をシフトして、SQ_71 , SQ_61 .. SQ_11に飛車の横方向の情報を持ってくる。 // このbitを直列化して7bit取り出して、これがindexとなる。 // しかし、r回の右シフトを以下の変数uに対して行なうと計算完了まで待たされるので、 // PEXT64()の第二引数のほうを左シフトしておく。 int r = (int)sq.ToRank(); UInt64 index = BitOp.PEXT32(occupied.p >> 5, (UInt32)0b10000100001 << r); return(RookRankEffectBB[(int)sq.ToFile(), index] << r); }
// ------------------------------------------------------------------------- // 以下、private methods / tables // ------------------------------------------------------------------------- // Haswellのpext()を呼び出す。occupied = occupied bitboard , mask = 利きの算出に絡む升が1のbitboard // この関数で戻ってきた値をもとに利きテーブルを参照して、遠方駒の利きを得る。 private static UInt64 OccupiedToIndex(Bitboard occupied, Bitboard mask) { return(BitOp.PEXT32(occupied.p, mask.p)); }
/// <summary> /// 下位bitから1bit拾ってそのbit位置を返す。 /// 少なくとも1bitは非0と仮定 /// while(to = bb.Pop()) /// Util.MakeMove(from,to); /// のように用いる。 /// </summary> /// <returns></returns> public Square Pop() { Debug.Assert(!IsZero()); return((Square)(BitOp.LSB32(ref p))); }