Author: Gerd Isenberg
Date: 14:54:04 04/14/04
Go up one level in this thread
On April 14, 2004 at 17:00:36, Tord Romstad wrote:
>On April 14, 2004 at 16:52:36, Gerd Isenberg wrote:
>
>>i really prefere even more inlines for abstraction...
>>Isn't there a cheaper tricks to do isCommonA1H8Diagonal, etc. with 0x88?
>
>I am not sufficiently fluent in bitboards to understand quite what your
>code is doing, but assuming that the function determines whether it is
>possible to get from square x to square y on an empty board by sliding in a
>direction parallel to the a1-h8 diagonal, this is indeed a very cheap operation
>with 0x88 (or other 16-file board representations). You just subtract x from y
>and look up the answer in a 256-byte lookup table.
>
>Tord
Ah, yes i remember. Seems a bit cheaper, a tiny lookup.
Yes the boolean functions check whether a rook or bishop on square x attacks
square y ( or vice versa). Both square coordinates are translated to bitset
metric, 2**sq, by lookup or 1<<sq. The difference of this power of two bitboard
metric values is a binary "one"-sequence from "less" (including) until "greater"
(excluding). To exclude less, we take "less"*2. The intersection of this
"inbetween"-values with the appropriate "path" leaves a set of all squares
between x and y on that ray. Path is the set of all squares on a ray(x,y).
eg., testing those two squares {e2,e6} on a common file:
a0 = 2**0 = lsb = bottom-left (not right! as regular with binary numbers)
Y|X
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
Y
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
X<<1 (is right here due to the mapping!)
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0
Y-(X<<1)
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0
path set (e2,e6)
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
final "inbetween" set
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
If the intersection of this inbetween-set with the "all"-occupied-set is empty,
no man sits on those squares, x is controlled by y with that sliding piece.
The functions seems interesting to check the validity of sliding moves after a
hash hit. A kogge stone fill is also nice for that purpose, shifting x in y
direction. Kogge stone takes some instructions more, but no path lookup.
And Kogge Stone gets sets of squares for x in y direction, rather than a boolean
property.
Gerd
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.