Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: How to reverse a Reverse BitBoard!

Author: Matt Taylor

Date: 02:33:20 01/22/03

Go up one level in this thread


On January 22, 2003 at 04:27:16, Dann Corbit wrote:

>On January 22, 2003 at 03:29:05, Matt Taylor wrote:
>
>>On January 21, 2003 at 17:03:33, Dann Corbit wrote:
>>
>>>On January 21, 2003 at 15:48:57, Sander de Zoete wrote:
>>>
>>>>The following instruction I found for the new architecture of Intel Chips
>>>>
>>>>BSWAP—Byte Swap
>>>>
>>>>Description
>>>>Reverses the byte order of a 32-bit (destination) register:
>>>>
>>>>Operation
>>>>TEMP ¬ DEST
>>>>DEST(7..0) ¬ TEMP(31..24)
>>>>DEST(15..8) ¬ TEMP(23..16)
>>>>DEST(23..16) ¬ TEMP(15..8)
>>>>DEST(31..24) ¬ TEMP(7..0)
>>>>Flags Affected
>>>>None.
>>>>Opcode Instruction Description
>>>>0F C8+ rd BSWAP r32 Reverses the byte order of a 32-bit register.
>>>>
>>>>It is only valid for 486 architecture.
>>>>
>>>>If this instruction can be used, it should be very easy to reverse Reverse
>>>>BitBoards into Forward Boards again. Saving a lot of updating in make and unmake
>>>>move and also be much faster using the bitboards for generating attack
>>>>board for evaluation purposes, incheck checks etc.
>>>>
>>>>The thing left to do is to reverse the bits per byte.
>>>>
>>>>I use the following trick, but it doesn't seem to work voor the value 9. Let me
>>>>show you what I mean: (and ofcourse, can you help me?)
>>>>
>>>>In C code, it looks like this:
>>>>
>>>>typedef unsigned __int64 BITBOARD;
>>>>
>>>>void ReverseBitsPerByte(BITBOARD bitboard)
>>>>{
>>>>//  1.  Load the constant, k = 5555555555555555h
>>>>BITBOARD k = 0x5555555555555555;
>>>>
>>>>//  2.  x = [(x shl 1) and k] or [(x and k) shr 1] result is: EFCDAB8967452301
>>>>bitboard = ((bitboard<<1) & k) | ((bitboard & k)>>1 );
>>>>}
>>>>
>>>>Initial bitboard:
>>>>11111110
>>>>11011100
>>>>10111010
>>>>10011000
>>>>01110110
>>>>01010100
>>>>00110010
>>>>00010000
>>>>
>>>>Result of ReverseBitsPerByte(bitboard):
>>>>01111111
>>>>00111011
>>>>01011101
>>>>00011000<--what the ^*&* goes wrong here? Should be 00011001.
>>>>01101110
>>>>00101010
>>>>01001100
>>>>00001000
>>>>
>>>>Thanks for any help or suggestions.
>>>
>><snip code>
>>
>>These are all basically the same algorithm. It's going to take a while to
>>rearrange everything when you do it bit-by-bit. Sander has the right idea by
>>first swapping bytes and then trying to reverse the bits within the bytes (8*2
>>ops + the swap as opposed to 64*2 ops).
>
>The algorithms don't perform identically.
>They don't require 64 ops.
>Once you get the "Sander" algorithm completed, compare the two (and also the
>COBRA algorithm).

Yes, breverse5 is a divide-and-conquer algorithm. The others all iterate 64
times. Assuming 2 ops/iteration was a gross underestimate as they use heavy
masking and shifting.

2 bswaps (and probably a mov, too) will reverse the bytes; afterward, the bits
can be reversed as well.

Not sure when or if I can have a look at COBRA and think about the algorithm --
I've got more than enough mandatory work right now.

-Matt



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.