Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Reversed vs. Rotated Bitboards (correction)

Author: Sune Fischer

Date: 01:10:07 01/29/02

Go up one level in this thread


On January 28, 2002 at 21:00:46, Ralf Elvsén wrote:

>On January 28, 2002 at 20:46:04, Ralf Elvsén wrote:
>
>>On January 28, 2002 at 13:26:02, Sune Fischer wrote:
>>
>>>On January 28, 2002 at 13:04:05, Sune Fischer wrote:
>>>
>>>This is what I get for half the rook, similar stuff is done for the backwards
>>>attacks using the reversed occupied bitboard.
>>>
>>>BITBOARD RookAttacksForward(BOARD &occupied, char square)
>>>{
>>>	BITBOARD a,x,y;
>>>
>>>	x=occupied>>square;  // shift board so square ends in lower left corner
>>>	y=x&RANK1;           // mask out ewerything but the first rank
>>>	a=y^(y-2);           // get the attacked bits on this rank
>>>	y=x&FILE1;           // now mask so we get a clean first file
>>>	y=y^(y-2);           // get the attacked squares
>>>	a=a|(y&FILE1);       // add the attacked bits after masking with the file again
>>>	a=a<<square);        // shift the attacked bits back (for ease of readability)
>>>
>>>	return a;
>>>}
>>>
>>>
>>>..untested, but something along those lines.
>>>Not entirely sure how to do it for the bishop, I guess we just shift to the
>>>lower right corner when attacking north-west and lower left when attacking
>>>north-east.
>>>
>>>But what happens if x=0?
>>>Will y then be 0 or something strange, the bitboard is unsigned so it should
>>>remain 0 right?
>>>
>>>-S.
>>
>>I think one should change
>>
>>y = x&RANK1
>>
>>to
>>
>>y = x|0x80
>
>The above is not correct. The most significant bit in the rank
>is not nr 7 any longer. I should know better then improvise
>bit manipulation 3 am, sorry :)
>
>Ralf
>
>>
>>That way the most significant bit in the rank will be set and when
>>you do the x^(x-2)-thing you will get a correct answer.
>>
>>I don't understand how you can use the same "occupied" to get
>>the file attacks but it's late here... :)
>>
>>x will never be zero since there is slider at "square".


the idea is this:

occupied = 110110011000111
x=8
occupied^(occypied-x*2)= 000000001111100

which are the attacked squares after you mask it in the direction you need.

There are some wrap-around problems for the diagonals and for the rank (the file
is no problem).
Example: when a rook on b1 is shifted to a1, the square a2 becomes h1 (a first
rank square), this is bad because a rook on b1 can't attack a piece on a2 and
this bit will be set if a2 is occupied and the rest of first rank is empty.
So I think my above code was not completely correct,
one more masking at the beginning or end is needed to fix that problem.

Anyway, it is easier to test and debug than rotated and it may even be faster on
some machines where memory bandwith is a huge bottleneck.

>>Ralf



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.