Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Reverse Bitboards

Author: Bas Hamstra

Date: 15:09:12 01/13/03

Go up one level in this thread


If I understand correctly, you

a) Shift the Occupied-mask so that "From" is in position 0
b) AND with a ray-mask such as RANK0
c) Apply the X ^ (X-2) trick
d) Shift the result back

In case of a queen this has to be done for
- rank
- file
- diag left
- diag right

and this in twofold, normal and reversed. So in fact we are talking about 8
operations (for each direction). Although this probably works (I have to test it
yet) compare this to rotated bitboards. Suppose I want to generate rookattacks.
First I want to generate the RANK attacks:

a) Shift the Occupied bitboard so many ranks that From is at RANK0
b) AND this with RANKMASK_0

This isolates the first rank and gives me a number from 0-255, because 8 bits
have 256 possible states. Now from a pre-computed lookuptable BB
Table[Square][State] I can read the places the rook can move to along the rank
it is on.

For files it is different, because file-bits are not "aligned" and won't give me
a number in the range 0-255. Therefore I keep a 90 degress rotated bitboard, so
that the filebits are aligned as ranks. And then I can do the same trick.

For diags it is even more complicated, because you have to fold non
uniform-length diagonals in a 8x8 square. But basically that's the same trick.

I would not be surprised if despite it's memory references, rotated biboards is
faster, at least at 32 bits cpu's. One shift, one AND and a memory lookup and
you're done for the entire ray. Four operations for a queen, not 8...

Toedeledokie!

Bas.















Shift the from square to 0
b)


On January 13, 2003 at 16:16:11, Sander de Zoete wrote:

>Does anyone use reverse bitboards? I'm writing a new chess program "Preatorian",
>which uses reverse bitboards. Up till now it looks good, but is still 10% slower
>on capture generation than my 0x88 program "Shark". And Shark is slow, it must
>say.
>
>I add some code to see if i'm doing it correct? What could be improved?
>
>//---------------------------------------------------------------------------
>//  Generate Rook Moves for Move List
>//  Bit Manipulation Trick for REVERSE Bitboard use
>//  BITBOARD x, y;
>//  y = x ^ (x - 4);
>//  Starting from bit 3 (4 = 0100) up, all bits are set to 1 until the
>//  first bit of x, which is 1. Also including this bit.
>//  eg. x = 0101 0011, y will be 0011 1100.
>//  Steps to use bit manipulation x ^ (x -2)
>//  1.  Shift allpieces bitboard to the right until the bit with the attacking
>//      piece is bit zero
>//  2.  Mask the rank/file (for offboard problems)
>//      (BITBOARD rank_mask = 0xFF; BITBOARD file_mask = 0x0101010101010101;)
>//  3.1 Perform the bit manipulation
>//  3.2 If file or diagonal: use file_mask/diagonal_mask again!
>//  4.1 Shift back to the left
>//  4.2 Use clear_right half of diagonal if bit 3 (int 4) is set to remove
>//      redundant/wrong squares in upper right corner
>//  5   Result is attacks by piece without piece itself
>//  6.  Use same steps 1 - 5 for reverse bitboard
>//---------------------------------------------------------------------------
>void RookRankMoves(TBoard *pos, BITBOARD rooksqueen_bitboard, BITBOARD
>all_pieces,
>                    int reverse, BITBOARD capture_board, int capture )
>{
>BITBOARD h1_bitboard, h2_bitboard;
>int sq_to, sq_fr;
>
>h1_bitboard = rq_bitboard;
>while(h1_bitboard)
>{   sq_fr = LSB(h1_bitboard);
>    h2_bitboard = all_pieces;
>    h2_bitboard = h2_bitboard>>sq_fr;
>    h2_bitboard = h2_bitboard ^ (h2_bitboard - 2);
>    h2_bitboard = h2_bitboard<<sq_fr;
>    h2_bitboard = h2_bitboard & (mask_rank_1<<(8*(sq_fr>>3))) ;
>    //h1_bitboard = Clear_LSB(h1_bitboard);
>    h1_bitboard ^= bit_mask[sq_fr];
>    //  remove captures/own pieces from non capture board
>    if (capture)
>    h2_bitboard &= capture_board;
>    else
>    h2_bitboard &= ~all_pieces;
>    while(h2_bitboard)
>    {   sq_to           = LSB(h2_bitboard);
>        //h2_bitboard     = Clear_LSB(h2_bitboard);
>        h2_bitboard ^= bit_mask[sq_to];
>        if (reverse)
>        AddMoveToList((63-sq_fr), (63-sq_to),
>                        (pos->piece_on_square[(63-sq_fr)]>>2),
>                        (pos->piece_on_square[(63-sq_to)]>>2), 0, 0, 0);
>        else
>        AddMoveToList(sq_fr, sq_to,
>                        (pos->piece_on_square[sq_fr]>>2),
>                        (pos->piece_on_square[sq_to]>>2), 0, 0, 0);
>        g_move_list_counter++;
>    }// while h2_board
>}// while h1_board
>}
>
>Thanks for any input,
>Sander de Zoete



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.