2017-12-21 3 views
2
私はこのようになります攻撃マスク、のうち一つの移動効率的に取得できますか

Chessprogramming:最もefficentlyビットボード攻撃マスクのうちの一つの動きを取得する方法

....1... 
1...1... 
.1..1..1 
..1.1.1. 
...111.. 
11111111 
..1.11.. 
.1..1.1. 

女王のために。

私が過去に行ったことは、末尾のゼロ(bitScanForward) を数えて、すべての可能な移動の四角形のインデックスを取得し、新しい移動を生成した後、次の攻撃方法を続行した。単一の攻撃ビットを直接入手する技術はありますか?

答えて

1

あなたが説明していることは、すでに最も効率的な方法だと思います。ビットボードが0になるまでループし、一度に1つの移動を選択します。いくつかのコードでアイデアをスケッチする

、それは次のようになります。

using Bitboard = uint64_t; // 64 bit unsigned integer 

pMoves createAllMoves(Bitboard mask, int from_sq, Move* pMoves) { 
    while(moves != 0) { 
    int to_sq = findAndClearSetBit(mask); 
    *pMoves++ = createMove(from_sq, to_sq); 
    } 
    return pMoves; 
} 

findAndClearSetBit機能を任意のセットビットを選択しますが、一般的に、今日のハードウェア上で、最下位ビットを見つけることが最も効率的であることができます。あなたはGCCやクランを使用している場合は、特定のハードウェアに最適化しなければならない__builtin_ctzllを使用することができます。

int findAndClearSetBit(Bitboard& mask) { 
    int sq = __builtin_ctzll(mask); // find least significant bit 
    mask &= mask - 1; // clear least significant bit 
    return sq; 
} 

を、私は間違っていないよ場合は、既存の機能bitScanForwardはすでに最下位ビットを見つけるための実装です。だから、あなたはそれを移植可能なバージョンを得るために使うことができます。

関連する問題