Computer Chess Club Archives


Search

Terms

Messages

Subject: How to reverse a Reverse BitBoard!

Author: Sander de Zoete

Date: 12:48:57 01/21/03


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.

Sander.





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.