Author: Steffan Westcott
Date: 04:27:17 09/14/02
Go up one level in this thread
On September 14, 2002 at 04:33:40, Sune Fischer wrote: >On September 14, 2002 at 04:10:46, Sune Fischer wrote: > >>I just thought of another application on the passed pawns. >>This way one doesn't need a 8x64 byte table or calls to firstone(). >>I can't say if it's faster than the lookup though, I'll probably >>use it anyway. >> >>//=================================================================== >>// find the passed and semi-passed pawns: >> >>BITBOARD WhitePassedPawns(BITBOARD w_pawns,BITBOARD b_pawns) { >> BITBOARD passed=0,tempA,tempB; >> int i=0; >> >> tempA=(w_pawns<<8)&~b_pawns; >> while (tempA) { >> tempB=tempA&rank8; >> i+=8; >> if (tempB) // a pawn has reached the 8th rank >> passed|=tempB>>i; // shift it back to where it originally came from >> tempA=(tempA<<8)&~b_pawns; >> } >> return passed; >>} > >Actually this may be faster, on 64 bit chips anyway: > > while (tempA) { > passed|=(tempA&rank8)>>(i+=8); > tempA=(tempA<<8)&~b_pawns; > } Sune, Somewhat simpler and faster still (!) is this approach : ---- CUT HERE ---- BitBoard FillDown(BitBoard b) { // Uses Kogge-Stone parallel prefix algorithm b |= b >> 8; b |= b >> 16; return b |= b >> 32; } BitBoard WhiteSemiPassedPawns(BitBoard w_pawns, BitBoard b_pawns) { return w_pawns & ~FillDown(b_pawns); } BitBoard WhitePassedPawns(BitBoard w_pawns, BitBoard b_pawns) { return w_pawns & ~FillDown( b_pawns | ShiftDownLeft (b_pawns) | ShiftDownRight(b_pawns)); } ---- CUT HERE ---- FillDown is an example of a simple flood fill, which 'smears' set bits in just one direction. Instead of using a normal fill loop, I've borrowed an idea normally found in fast adder hardware. This sort of fill is great for things like attack or move generator bitboards. Cheers, Steffan
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.