Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: to Mr Wegner. 45° rotated bitboard. Am I doing well?

Author: Zach Wegner

Date: 08:14:25 12/12/03

Go up one level in this thread


On December 12, 2003 at 09:50:34, Maurizio Di Vitto wrote:

>Dear Mr Wegner,
>Thank you for your explanation, it was very clear and I solved all the problem.
>I am going to write code about diagonals moves, so I know I need a 45° rotated
>bitboard, before I start thinking about how to improve that I’d like to show you
>how I represent the chessboard:
>
>63 62 61 60 59 58 57 56
>55 54 53 52 51 50 49 48
>47 46 45 44 43 42 41 40
>39 38 37 36 35 34 33 32
>31 30 29 28 27 26 25 24
>23 22 21 20 19 18 17 16
>15 14 13 12 11 10  9  8
> 7  6  5  4  3  2  1  0
>a1 b1 c1 d1 e1 f1  g1 h1
>
>the 90° rotatedbitboard should work well:
>
>int rotated90r[64]={7,15,23,31,39,47,55,63,
>            	    6,14,22,30,38,46,54,62,
> 	            5,13,21,29,37,45,53,61,
>     	            4,12,20,28,36,44,52,60,
>     	            3,11,19,27,35,43,51,59,
>                    2,10,18,26,34,42,50,58,
>                    1,9, 17,25,33,41,49,57,
>                    0,8, 16,24,32,40,48,56
>};
>
>the 45° rotated bitboard should look like this (for now I care about a1-h8
>diagonal):
>
>Rotated45[64]
>
>63  55  62  47  54  61  39  46
>53  60  31  38  45  52  59  23
>30  37  44  51  58  15  22  29
>36  43  50  57  7    14  21  28
>35  42  49  56  6    13  20  27
>34  41  48  5   12   19  26  33
>40  4   11  18  25   32  3   10
>17  24  2   9   16   1   8    0
>
>then I need an array to calculate the number of state about a diagonal
>(2^state_index[square]):
>
>int state_index[64] = {
>1,2,3,4,5,6,7,8,
>2,3,4,5,6,7,8,7,
>3,4,5,6,7,8,7,6,
>4,5,6,7,8,7,6,5,
>5,6,7,8,7,6,5,4,
>6,7,8,7,6,5,4,3,
>7,8,7,6,5,4,3,2,
>8,7,6,5,4,3,2,1 };
>
>then I need another array to know how many unit I have to shift, It would look
>like:
>
>shift_index[64]={ 0, 1, 3, 6,  10, 15, 21, 28,
>	          1, 3, 6, 10, 15, 21, 28, 36,
>		  3, 6, 10,15, 21, 28, 36, 43,
>		  6, 10,15,21, 28, 36, 43, 49,
>		  10,15,21,28, 36, 43, 49, 54,
>		  15,21,28,36, 43, 49, 54, 58,
>		  21,28,36,43, 49, 54, 58, 61,
>		  28,36,43,49, 54, 58, 61, 63
>};
>
>
>
>so I would write something like that:
>
>for (square=0; square<64; ++square)
>	{
>		for (state=0; state=2^state_index[square]; ++state)
>			{
>				keep_value=state<<shift_index[square];

This will cause some problems because the keep_value will not be rotated. I find
that the best way to initialize rotated bitboards is to have a seperate state
byte that represents the rotated state of the diagonal when the bitboard is set.
This might look like:

unsigned char tstate;
int x;
for (square = 0; square < 64; square++)
{
    for (state = 0; state < 256; state++)
    {
        for (x = square, tstate = mask[File(square)]; !(tstate & (state ^
mask[File(square)]); )
                            //this for loop should also check that x does not
                         //cross over the edges of the board
        {
            x += 7;
            tstate >>= 1;
            attacksr45 |= mask[x];
        }
        //repeat for other direction
    }
}
//repeat for other diagonal
>		//What’s the best way to refer to the square. I
>                //mean:
>	        //example: square=14(the main diagonal a1-h8)
>		//I need to shift left and right to the 45° rotated bitboard,
>		//How can I find the index of the square number 14 to the
>		//45° rotated bitboard. I thought about another array
>		//where I can control the right index, but it doesn’t
>		//seem the right solution.

This is what I and (I think) everyone else does. You have two arrays per
45-degree rotated bitboard, one for the index, and one for the shift.
>}
>}
>
>
>Am I on the right way?

Yes.
>
>Big Thanks again.
>Maurizio Di Vitto.

Regards,
Zach



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.