Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: How to reverse a Reverse BitBoard!

Author: Matt Taylor

Date: 00:29:05 01/22/03

Go up one level in this thread


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).

-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.