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 u     = (occupied.p.p1 << 6 * 9) + (occupied.p.p0 >> 9);
            UInt64 index = BitOp.PEXT64(u, 0b1000000001000000001000000001000000001000000001000000001UL << r);

            return(RookRankEffectBB[(int)sq.ToFile(), index] << r);
        }
Beispiel #2
0
 // Haswellのpext()を呼び出す。occupied = occupied bitboard , mask = 利きの算出に絡む升が1のbitboard
 // この関数で戻ってきた値をもとに利きテーブルを参照して、遠方駒の利きを得る。
 private static UInt64 OccupiedToIndex(Bitboard occupied, Bitboard mask)
 {
     return(BitOp.PEXT64(occupied.Merge(), mask.Merge()));
 }
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((p.p0 != 0) ? (Square)(BitOp.LSB64(ref p.p0)) : (Square)(BitOp.LSB64(ref p.p1) + 63));
 }
Beispiel #4
0
 /// <summary>
 /// 下位bitから1bit拾ってそのbit位置を返す。
 /// 少なくとも1bitは非0と仮定
 /// while(to = bb.Pop())
 ///   Util.MakeMove(from,to);
 /// のように用いる。
 /// </summary>
 /// <returns></returns>
 public Square Pop()
 {
     return((p.p0 != 0) ? (Square)(BitOp.LSB64(ref p.p0)) : (Square)(BitOp.LSB64(ref p.p1) + 63));
 }