Author: Gerd Isenberg
Date: 12:52:39 04/14/04
Hi Rasjid, i found a slight improvement in one of your three interesting sliding attack macros. It replaces the "inbetween"-expression isqBit(y)-1 & ~( isqBit(x)-1 | isqBit(x) ) by isqBit(y) - isqBit(x+1) or isqBit(y) -(isqBit(x)<<1) If one subtracts power of two values, greater minus less: 0100 0000 -0000 0100 the result is =0011 1100 a "inner" sequence of ones, except "less" is included. So we start with next greater bit of "less". Couldn't resist to use inlines instead of macros ;-) (not tested!) Cheers, Gerd typedef unsigned _int64 U64 #define GetFile64(sq) ((sq) & 7) #define GetRank64(sq) ((sq) >> 3) #define iGetFile(sq88) ((sq88) & 7) #define iGetRank(sq88) ((sq88) >> 4) #define sq88Bit(sq88) ((U64)1 << (((sq88) + ((sq88) & 7)) >> 1)) #define sq64Bit(sq64) (((U64)1) << (sq64)) #define sq88RankBits(sq88) ((U64)0xff << ((sq88) >> 1 & 0370)) #define sq88FileBits(sq88) ((U64) 0x0101010101010101 << ((sq88) & 7)) //*** global variables U64 all, diagonal[2][15]; inline // __forceinline bool brq_path_clear(int x, int y, U64 path) { if (x < y) return ((isqBit(y) - isqBit(x+1)) & path & all) == 0; if (x > y) return ((isqBit(x) - isqBit(y+1)) & path & all) == 0; return false; } inline // __forceinline bool bstyle_attack(int x, int y) { if ( iGetRank(x) + iGetFile(x) == iGetRank(y) + iGetFile(y) ) return brq_path_clear(x, y, diagonal[1][iGetRank(x) + iGetFile(x)]); if ( iGetRank(x) - iGetFile(x) == iGetRank(y) - iGetFile(y) ) return brq_path_clear(x, y, diagonal[0][7 + iGetRank(x) - iGetFile(x)]); return false; } inline // __forceinline bool rstyle_attack(int x, int y) { if ( iGetRank(x) == iGetRank(y) ) return brq_path_clear(x, y, isqRankBits(x)); if ( iGetFile(x) == iGetFile(y) ) return brq_path_clear(x, y, isqFileBits(x)); return false; }
This page took 0.01 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.