/// <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 u = (occupied.p.p1 << 6 * 9) + (occupied.p.p0 >> 9); UInt64 index = BitOp.PEXT64(u, 0b1000000001000000001000000001000000001000000001000000001UL << r); return(RookRankEffectBB[(int)sq.ToFile(), index] << r); }
// Haswellのpext()を呼び出す。occupied = occupied bitboard , mask = 利きの算出に絡む升が1のbitboard // この関数で戻ってきた値をもとに利きテーブルを参照して、遠方駒の利きを得る。 private static UInt64 OccupiedToIndex(Bitboard occupied, Bitboard mask) { return(BitOp.PEXT64(occupied.Merge(), mask.Merge())); }