Author: Gerd Isenberg
Date: 01:14:37 05/10/05
Go up one level in this thread
On May 09, 2005 at 14:07:37, Steven Edwards wrote: >On May 09, 2005 at 10:19:23, Gerd Isenberg wrote: >>On May 09, 2005 at 07:48:51, Steven Edwards wrote: > >>>The actual code for FirstSq/NextSq will depend on the specific bit/square >>>correspondance. For Symbolic's toolkit, the CTBB::NextSq() member function is: >>> >>>#if (CTHostMac && CTArchBits32 && CTAllowAssembly) >>> CTSq NextSq(void) >>> { >>> int theZC = __cntlzw(myDwrdVec[0]); >>> >>> if (theZC != 32) >>> { >>> myDwrdVec[0] ^= 1 << (31 - theZC); >>> return (CTSq) (theZC ^ 0x07); >>> } >>> else >>> { >>> theZC = __cntlzw(myDwrdVec[1]); >>> if (theZC != 32) >>> { >>> myDwrdVec[1] ^= 1 << (31 - theZC); >>> return (CTSq) ((theZC ^ 0x07) + 32); >>> } >>> else >>> return CTSqNil; >>> }; >>> } >>>#endif > >>>The above "(theZC ^ 0x07)" operations could be removed if the bit/square >>>correspondance was altered (reversed) to have a-file squares appear in the MSbit >>>instead of the LSBit. I believe this is how Crafty arranges the bits, but I >>>haven't tested it. Currently, Crafty does not have assemply language level >>>optimizations for PowerPC. Possibly some ambitious author could contribute in >>>that area. > >>confusion about LSBit and MSBit ;-) >> >>Lets take the first rank with eight binary digits for each file. Bit 0, the most >>right is the least significant bit LSBit. I use the "mirrored" mapping LSB = a1 >>and MSB = h1, while you seem to map in the "natural" way MSB = a1 and LSB h1? >> >>MSBit LSBit 2**0 >>| | >>00000001B 0x01 ; a1 for me - h1 for you >>10000000B 0x80 ; h1 for me - a1 for you >> >>If you traverse a (-1) bitboard (all bits set) with that routine >>you receive a kind of "sawtooth": 56,57,..,63, 48,47,..,55,.,..,..,0,1,..,7. >>Did i get that correct? > >No, I get a1, b1, ...h1, a2, ... g8, h8. I guess i'm not only confused with your LSB/MSB but also by big/little endian ;-) > >>May be a bit pedantic to save a subtract and to shift INT_MIN logical right ;-) >> >> myDwrdVec[0] ^= (unsigned)(1<<31) >> theZC; // >>> >>instead of >> myDwrdVec[0] ^= 1 << (31 - theZC); > >The CTBB storage declaration: Ok, those set/test/reset/popcount routines look familar to me. > > union > { > CTByte myByteVec[CTBBByteLen]; > CTWord myWordVec[CTBBWordLen]; > CTDwrd myDwrdVec[CTBBDwrdLen]; > CTQwrd myQwrdVec[CTBBQwrdLen]; > }; > >#define CTBX(base) (1 << (base)) > > void ResetSq(const CTSq theSq) > { > myByteVec[theSq >> 3] &= ~CTBX((theSq & 0x07)); > } > > void SetSq(const CTSq theSq) > { > myByteVec[theSq >> 3] |= CTBX((theSq & 0x07)); > } > > void ResetSq(const CTRank theRank, const CTFile theFile) > { > myByteVec[theRank] &= ~CTBX(theFile); > } > > void SetSq(const CTRank theRank, const CTFile theFile) > { > myByteVec[theRank] |= CTBX(theFile); > } > > bool IsReset(const CTSq theSq) const > { > return !(myByteVec[theSq >> 3] & CTBX((theSq & 0x07))); > } > > bool IsSet(const CTSq theSq) const > { > return myByteVec[theSq >> 3] & CTBX((theSq & 0x07)); > } > > unsigned int Card(void) const > { > return > CardVec[myWordVec[0]] + CardVec[myWordVec[1]] + > CardVec[myWordVec[2]] + CardVec[myWordVec[3]]; > } > > unsigned int CardFew(void) const > { > unsigned int theCount = 0; > CTBitVector theBitVector = GetBitVector(); > > while (theBitVector) > { > theCount++; > theBitVector &= (theBitVector - 1); > }; > return theCount; > }
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.