X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.cpp;h=d4b8bcfdf2cabb53d59e20ff8a055688db6a54a8;hp=6784effd3d6b546c64e4192f10984b651ec0b8d2;hb=bc183b0c04e25cdc907ffe1376de9bc1cded027a;hpb=41641e3b1eea0038ab6984766d2b3bca869be7fa diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 6784effd..d4b8bcfd 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -18,8 +18,7 @@ */ #include -#include -#include +#include // For memset #include "bitboard.h" #include "bitcount.h" @@ -130,19 +129,17 @@ Square msb(Bitboard b) { const std::string Bitboards::pretty(Bitboard b) { - std::ostringstream ss; + std::string s = "+---+---+---+---+---+---+---+---+\n"; for (Rank rank = RANK_8; rank >= RANK_1; --rank) { - ss << "+---+---+---+---+---+---+---+---+" << '\n'; - for (File file = FILE_A; file <= FILE_H; ++file) - ss << "| " << (b & (file | rank) ? "X " : " "); + s.append(b & make_square(file, rank) ? "| X " : "| "); - ss << "|\n"; + s.append("|\n+---+---+---+---+---+---+---+---+\n"); } - ss << "+---+---+---+---+---+---+---+---+"; - return ss.str(); + + return s; } @@ -246,20 +243,6 @@ namespace { } - Bitboard pick_random(RKISS& rk, int booster) { - - // Values s1 and s2 are used to rotate the candidate magic of a - // quantity known to be optimal to quickly find the magics. - int s1 = booster & 63, s2 = (booster >> 6) & 63; - - Bitboard m = rk.rand(); - m = (m >> s1) | (m << (64 - s1)); - m &= rk.rand(); - m = (m >> s2) | (m << (64 - s2)); - return m & rk.rand(); - } - - // init_magics() computes all rook and bishop attacks at startup. Magic // bitboards are used to look up attacks of sliding pieces. As a reference see // chessprogramming.wikispaces.com/Magic+Bitboards. In particular, here we @@ -268,8 +251,9 @@ namespace { void init_magics(Bitboard table[], Bitboard* attacks[], Bitboard magics[], Bitboard masks[], unsigned shifts[], Square deltas[], Fn index) { - int MagicBoosters[][8] = { { 3191, 2184, 1310, 3618, 2091, 1308, 2452, 3996 }, - { 1059, 3608, 605, 3234, 3326, 38, 2029, 3043 } }; + int MagicBoosters[][8] = { { 969, 1976, 2850, 542, 2069, 2852, 1708, 164 }, + { 3101, 552, 3555, 926, 834, 26, 2131, 1117 } }; + RKISS rk; Bitboard occupancy[4096], reference[4096], edges, b; int i, size, booster; @@ -309,7 +293,7 @@ namespace { // Find a magic for square 's' picking up an (almost) random number // until we find the one that passes the verification test. do { - do magics[s] = pick_random(rk, booster); + do magics[s] = rk.magic_rand(booster); while (popcount((magics[s] * masks[s]) >> 56) < 6); std::memset(attacks[s], 0, size * sizeof(Bitboard));