如何在 C++ 中初始化位板?
How to initialize bitboards in c++?
我已经仔细研究了 bit-board 上的国际象棋编程 wiki,但我仍在为我应该如何实际创建它们而苦苦挣扎。根据我收集到的信息,它们应该是 uint64_t 对吧?有时我看到它们表示为长的十六进制数字,就像在鳕鱼中一样,而其他时候我看到它们表示为 64 位二进制数。
例如,我如何获取一组棋盘位置并将其转换为每个棋子的位图,然后是颜色的两个位图?
终于可以像这样定义位板了:
typedef unsigned long long U64; // supported by MSC 13.00+ and C99
#define C64(constantU64) constantU64##ULL
U64 BBFullBoard = 0xffffffffffffffffULL;
因为像 unsigned long long
这样的东西不能保证有任何特定的位数,所以在这里使用 cstdint
是个好主意,像这样:
#include <cstdint>
uint64_t board;
但是,使用 std::bitset
可能会以更少的努力生成更具可读性的代码:
#include <bitset>
#include <cassert>
class BitBoard {
private:
std::bitset<64> board;
public:
auto operator()(int x, int y){
assert(0<=x && x<=7);
assert(0<=y && y<=7);
return board[8*y+x];
}
void setAll(bool val){
if(val)
board.set(); //All bits on
else
board.reset(); //All bits off
}
};
int main(){
BitBoard board;
}
我不确定哪一个会更高效。其他人发表了对性能的看法 。
我已经仔细研究了 bit-board 上的国际象棋编程 wiki,但我仍在为我应该如何实际创建它们而苦苦挣扎。根据我收集到的信息,它们应该是 uint64_t 对吧?有时我看到它们表示为长的十六进制数字,就像在鳕鱼中一样,而其他时候我看到它们表示为 64 位二进制数。
例如,我如何获取一组棋盘位置并将其转换为每个棋子的位图,然后是颜色的两个位图?
终于可以像这样定义位板了:
typedef unsigned long long U64; // supported by MSC 13.00+ and C99
#define C64(constantU64) constantU64##ULL
U64 BBFullBoard = 0xffffffffffffffffULL;
因为像 unsigned long long
这样的东西不能保证有任何特定的位数,所以在这里使用 cstdint
是个好主意,像这样:
#include <cstdint>
uint64_t board;
但是,使用 std::bitset
可能会以更少的努力生成更具可读性的代码:
#include <bitset>
#include <cassert>
class BitBoard {
private:
std::bitset<64> board;
public:
auto operator()(int x, int y){
assert(0<=x && x<=7);
assert(0<=y && y<=7);
return board[8*y+x];
}
void setAll(bool val){
if(val)
board.set(); //All bits on
else
board.reset(); //All bits off
}
};
int main(){
BitBoard board;
}
我不确定哪一个会更高效。其他人发表了对性能的看法