Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        // -------------------------------------------------------------------------
        // 以下、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));
        }
Beispiel #3
0
 /// <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)));
 }