Author: Ralf Elvsén
Date: 03:10:53 01/29/02
Go up one level in this thread
On January 29, 2002 at 04:10:07, Sune Fischer wrote: >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. Yes, that was what I was trying to do. If (in this case) h1 is set you don't have to mask after the occ^(occ-2) -thing. I think the easiest way maybe is. x = (occ | 0x8080808080808080) >> square a = (x^(x-2)) >> square > >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. Yes, I think it can be just fine for move generation. But I'm not so sure how it fits in regarding the other things now handled by e.g. rotated bitboards. Ralf > >>>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.