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.