Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Bitboard question

Author: Russell Reagan

Date: 06:58:38 04/17/03

Go up one level in this thread


On April 17, 2003 at 09:08:54, Jaime Benito de Valle Ruiz wrote:

>__int64 x;
>int y;
>
>__asm{
>        mov eax,dword ptr[x+4]
>        mov ebx,dword ptr[x]
>        bsf ecx,eax
>        add ecx,32
>        bsr ecx,[x]
>        mov [y],ecx
>}
>printf("The bit set to 1 is the bit No. %d",y);

I don't know if you meant to do this or not, but you used bsf in one place and
bsr in another.

Keep in mind that this will not work if x is 0. You also don't need the mov's at
the beginning. Faster, and safer, would be:

int LowBit (unsigned __int64 x) {
    __asm {
        mov eax, -33
        bsf eax, dword ptr [x + 4]
        add eax,32
        bsf eax, dword ptr [x]
      }
}

This will return -1 if there are no 1-bits in x.

>Another (faster) alternative if check first if one of the two 32bit registers is
>set to 0, and then skip the BSF/BSR for that register, and do it only for the
>other one, avoiding using a potentially slow BitScan.

It depends which processor you are working with. If you are working on a PIII,
for instance, the bsf/bsr instructions are 1-2 cycles, so you should avoid the
conditional there. Then when you move to the PIV, you have larger branch
misprediction penalties, so it might not be worth it there either.



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.