Rotated+Bitboards

a bitboard move generation technique coined by Robert Hyatt, and later by Ernst A. Heinz and Peter Gillgasch from the DarkThought team. This variation uses rotated copies of the occupancy in order to place bits along a file, diagonal or anti-diagonal in adjacent bits. Because of this, these bits can be easily extracted to obtain a dense occupancy map for a rank, file, diagonal, and anti-diagonal. These are used, along with the square of the sliding piece, to lookup a bitboard, containing attacks, in an array.
 * Home * Board Representation * Bitboards * Sliding Piece Attacks * Rotated Bitboards**
 * [[image:Curl-up.jpg width="297" height="238" link="http://www.mcescher.com/Gallery/back-bmp/LW374.jpg"]] ||~  || **Rotated Bitboards**,

While the attack generation per line is more or less only one memory lookup, the incremental update of the occupancy during make and unmake move becomes more expensive, since beside the usual Bitboard Board-Definition [[toc =An Example= As example file-attacks of rook a5 with occupancy along the a-file. The 90-degree rotated bitboard has consecutive bits of that file along its 8th rank, which serves as an index to lookup the pre-calculated file-attacks: code non-rotated           rotated             file_attacks[a5][rotated] ┌─┐                 ┌───────────────┐     ┌─┐ │1│0 0 0 0 0 0 0    │1_0_0_1_R_0_1_1│════>│0│0 0 0 0 0 0 0 │1│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │1│0 0 0 0 0 0 0 │0│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │1│0 0 0 0 0 0 0 │R│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │0│0 0 0 0 0 0 0 │1│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │1│0 0 0 0 0 0 0 │0│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │0│0 0 0 0 0 0 0 │0│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │0│0 0 0 0 0 0 0 │1│0 0 0 0 0 0 0     0 0 0 0 0 0 0 0      │0│0 0 0 0 0 0 0 └─┘                                       └─┘ code With a rook on the square marked 'R', an attack bitboard can be obtained with the array lookup file_attacks[R][10011011].
 * 1) Occupancy|occupied bitboard]] there are three more rotated bitboards to update, including additional mapping from square coordinates to the rotated indices. ||
 * M. C. Escher, Curl-up, 1951 ||~  ||^   ||

=Square Mapping= Interesting is the different mapping of both approaches. Crafty seemed to use little endian square mapping but bit 0 (A1) is mentioned as MSB, while bit 63 (H8) is LSB. DarkThought uses big-endian file-mapping (H1 = 0).

by Hyatt
Crafty didn't use byte aligned diagonals, but visual rotation. code normal chess board bitmap           occupied_squares 90 degrees

A8 B8 C8 D8 E8 F8 G8 H8             H8 H7 H6 H5 H4 H3 H2 H1  A7 B7 C7 D7 E7 F7 G7 H7              G8 G7 G6 G5 G4 G3 G2 G1  A6 B6 C6 D6 E6 F6 G6 H6              F8 F7 F6 F5 F4 F3 F2 F1  A5 B5 C5 D5 E5 F5 G5 H5              E8 E7 E6 E5 E4 E3 E2 E1  A4 B4 C4 D4 E4 F4 G4 H4              D8 D7 D6 D5 D4 D3 D2 D1  A3 B3 C3 D3 E3 F3 G3 H3              C8 C7 C6 C5 C4 C3 C2 C1  A2 B2 C2 D2 E2 F2 G2 H2              B8 B7 B6 B5 B4 B3 B2 B1  A1 B1 C1 D1 E1 F1 G1 H1              A8 A7 A6 A5 A4 A3 A2 A1

original left 45                    original right 45

H8                                A8            G8  H7                             A7  B8          F8  G7  H6                         A6  B7  C8        E8  F7  G6  H5                     A5  B6  C7  D8      D8  E7  F6  G5  H4                 A4  B5  C6  D7  E8    C8  D7  E6  F5  G4  H3             A3  B4  C5  D6  E7  F8  B8  C7  D6  E5  F4  G3  H2         A2  B3  C4  D5  E6  F7  G8 A8  B7  C6  D5  E4  F3  G2  H1     A1  B2  C3  D4  E5  F6  G7  H8  A7  B6  C5  D4  E3  F2  G1         B1  C2  D3  E4  F5  G6  H7    A6  B5  C4  D3  E2  F1             C1  D2  E3  F4  G5  H6      A5  B4  C3  D2  E1                 D1  E2  F3  G4  H5        A4  B3  C2  D1                     E1  F2  G3  H4          A3  B2  C1                         F1  G2  H3            A2  B1                             G1  H2              A1                                 H1

original left 45                    original right 45

G6 H5|F8 G7 H6|G8 H7|H8|           C7 D8|A6 B7 C8|A7 B8|A8| H3|D8 E7 F6 G5 H4|E8 F7            F8|A4 B5 C6 D7 E8|A5 B6   F4 G3 H2|C8 D7 E6 F5 G4             E6 F7 G8|A3 B4 C5 D6 E7   E4 F3 G2 H1|B8 C7 D6 E5             E5 F6 G7 H8|A2 B3 C4 D5   D4 E3 F2 G1|A8 B7 C6 D5             E4 F5 G6 H7|A1 B2 C3 D4   B5 C4 D3 E2 F1|A7 B6 C5             D2 E3 F4 G5 H6|B1 C2 D3   C2 D1|A5 B4 C3 D2 E1|A6             G3 H4|D1 E2 F3 G4 H5|C1 |A1|A2 B1|A3 B2 C1|A4 B3           |H1|G1 H2|F1 G2 H3|E1 F2 code

by Gillgasch and Heinz
DarkThought used a similar mapping as proposed in Pseudo Rotation by 45 degrees from Flipping Mirroring and Rotating, all diagonals are packed in file-aligned bytes. code Normal Bitboard. Flipped Bitboard. a8 b8 c8 d8 e8 f8 g8 h8 #7            a8 a7 a6 a5 a4 a3 a2 a1 #7 a7 b7 c7 d7 e7 f7 g7 h7 #6            b8 b7 b6 b5 b4 b3 b2 b1 #6 a6 b6 c6 d6 e6 f6 g6 h6 #5            c8 c7 c6 c5 c4 c3 c2 c1 #5 a5 b5 c5 d5 e5 f5 g5 h5 #4            d8 d7 d6 d5 d4 d3 d2 d1 #4 a4 b4 c4 d4 e4 f4 g4 h4 #3            e8 e7 e6 e5 e4 e3 e2 e1 #3 a3 b3 c3 d3 e3 f3 g3 h3 #2            f8 f7 f6 f5 f4 f3 f2 f1 #2 a2 b2 c2 d2 e2 f2 g2 h2 #1            g8 g7 g6 g5 g4 g3 g2 g1 #1 a1 b1 c1 d1 e1 f1 g1 h1 #0            h8 h7 h6 h5 h4 h3 h2 h1 #0
 * 1) 7 #6 #5 #4 #3 #2 #1 #0 Bit/Byte      #7 #6 #5 #4 #3 #2 #1 #0 Bit/Byte

A1-H8 Bitboard. A8-H1 Bitboard. a8|b1 c2 d3 e4 f5 g6 h7 #7            a8 b7 c6 d5 e4 f3 g2 h1 #7 a7 b8|c1 d2 e3 f4 g5 h6 #6            a7 b6 c5 d4 e3 f2 g1|h8 #6 a6 b7 c8|d1 e2 f3 g4 h5 #5            a6 b5 c4 d3 e2 f1|g8 h7 #5 a5 b6 c7 d8|e1 f2 g3 h4 #4            a5 b4 c3 d2 e1|f8 g7 h6 #4 a4 b5 c6 d7 e8|f1 g2 h3 #3            a4 b3 c2 d1|e8 f7 g6 h5 #3 a3 b4 c5 d6 e7 f8|g1 h2 #2            a3 b2 c1|d8 e7 f6 g5 h4 #2 a2 b3 c4 d5 e6 f7 g8|h1 #1            a2 b1|c8 d7 e6 f5 g4 h3 #1 a1 b2 c3 d4 e5 f6 g7 h8|#0            a1|b8 c7 d6 e5 f4 g3 h2 #0 code
 * 1) 7 #6 #5 #4 #3 #2 #1 #0 Bit/Byte      #7 #6 #5 #4 #3 #2 #1 #0 Bit/Byte

Quotes
From Robert Hyatt as repost to Urban Koistinen from 1997 :

=Table size= The initial implementations of rotated bitboards missed the outer square optimization and used the 8-bit occupied state with four lookup tables of 256*64*8 or 128-Kbyte each, thus 1/2 MByte in total. Roberto Waldteufel seemed first time mentioned the optimization trick 1998, masking off the redundant outer occupancies for a four fold table reduction.

Of course one may use calculations similar to kindergarten bitboards to further shrink the tables. In fact, getting the occupancy state and pre-calculated information based on that are two different steps.

=See also=
 * Flipping Mirroring and Rotating
 * Kindergarten Bitboards
 * Occupancy of any Line
 * Rotated Indices

=Publications=
 * Ernst A. Heinz (**1997**). //[|How DarkThought Plays Chess].// ICCA Journal, Vol. 20, No. 3
 * Robert Hyatt (**1999**). //[|Rotated Bitmaps, a New Twist on an Old Idea]//. ICCA Journal, Vol. 22, No. 4
 * Borko Bošković, Sašo Greiner, Janez Brest, Viljem Žumer (**2005**). //[|The Representation of Chess Game]//. Proceedings of the 27th International Conference on Information Technology Interfaces
 * Johannes Buchner (**2005**). //Rotated bitboards in FUSc#//. Free University of Berlin, [|pdf] » FUSc#

=Forum Posts=

1995 ...

 * [|bitmaps of rotated boards] by Urban Koistinen, gnu.chess, March 2, 1995
 * [|Re: Speed of Move Generator] by Robert Hyatt, rgcc, August 17, 1995
 * [|Rotated bitboards - experiment and result] by Robert Hyatt, rgcc, February 28, 1996
 * [|bitboard move generation question] by Stuart Cracraft, rgcc, September 05, 1997
 * [|Bitboard Representation] by Carl Tillotson, rgcc, September 18, 1997
 * [|Rotated bitboards] by Mats Forsén, rgcc, October 29, 1997
 * [|Rotated bitboards] by Peter Fendrich, CCC, April 22, 1998
 * [|Efficient Rotated Bitboard Representations] by Roberto Waldteufel, CCC, October 28, 1998
 * [|Extracting information from rotated Bitboards] by John Stoneham, CCC, November 02, 1998
 * [|Bitboard user's information request] by Robert Hyatt, CCC, October 05, 1999

2000 ...

 * [|Nice Rotated-bitmaps Article by Hyatt in ICCA] by Tom Likens, CCC, February 07, 2000
 * [|Rotated Bitboards?] by Mauricio Castro, rgcc, October 07, 2001
 * [|Attack Bitboards] by Sune Fischer, CCC, October 30, 2001
 * [|Resources about rotated bitboards] by Federico Corigliano, CCC, January 02, 2004

2005 ...

 * [|Generating "through" attacks with rotated bitboard] by Vlad Stamate, CCC, August 28, 2009 » X-ray Attacks (Bitboards)

2010 ...

 * [|A question on rotated bitboard] by n_ven, OpenChess Forum, May 04, 2011

=External Links= > media type="youtube" key="4vACvafOvq0" width="560"
 * [|Rotated Bitboards] by Ernst A. Heinz
 * [|Rotated bitmaps, a new twist on an old idea] by Robert Hyatt, revisited version of the ICCA Journal paper
 * [|Computer Chess Programming Theory - Bitboards] by Colin Frayn
 * [|Herb Alpert] - [|Rotation] (1979), [|YouTube] Video

=References= =What links here?= include page="Rotated Bitboards" component="backlinks" limit="100"
 * Up one Level**