8x8-Bitfeld (= unsigned long long) um 45 Grad drehen?



  • Wie kann ich ein 8x8-Bitfeld (= unsigned long long) um 45 Grad drehen?

    Meine Quelle ist http://chessprogramming.wikispaces.com/Flipping+Mirroring+and+Rotating Dort siehe Abschnitt "Pseudo-Rotation by 45 degrees"

    /**
     * Pseudo rotate a bitboard 45 degree clockwise.
     * Main Diagonal is mapped to 1st rank
     * @param x any bitboard
     * @return bitboard x rotated
     */
    U64 pseudoRotate45clockwise (U64 x) {
       const U64 k1 = C64(0xAAAAAAAAAAAAAAAA);
       const U64 k2 = C64(0xCCCCCCCCCCCCCCCC);
       const U64 k4 = C64(0xF0F0F0F0F0F0F0F0);
       x ^= k1 & (x ^ rotateRight(x,  8));
       x ^= k2 & (x ^ rotateRight(x, 16));
       x ^= k4 & (x ^ rotateRight(x, 32));
       return x;
    }
    

    Aber rotateRight wird auf der Seite nicht definiert 😞



  • Wahrscheinlich einfach ein zyklischer shift.



  • schachprogrammierer schrieb:

    Aber rotateRight wird auf der Seite nicht definiert 😞

    Doch.



  • Uups.





  • volkard schrieb:

    Sone doppelt.
    Klickt doch mal auf den Link. Es geht drum, ein Bitboard zu drehen.

    pseudoRotate45clockwise() rotiert das Board.
    rotateRight() rotiert ein 64-Bit-Unsigned.


  • Mod

    Edit: Leider gibt es keine vernünftige Studio-Version auf Youtube... 😡



  • Es funktioniert nicht richtig:

    inline unsigned long long rotateLeft(unsigned long long x, int s) { return _rotl64(x, s); }
    inline unsigned long long rotateRight(unsigned long long x, int s) { return _rotr64(x, s); }
    
    Bitboard Bitboard::rotiere45GradImUhrzeigersinn() const
    {
    	unsigned long long x = data;
    	const unsigned long long k1 = 0xAAAAAAAAAAAAAAAAull;
    	const unsigned long long k2 = 0xCCCCCCCCCCCCCCCCull;
    	const unsigned long long k4 = 0xF0F0F0F0F0F0F0F0ull;
    	x ^= k1 & (x ^ rotateRight(x, 8));
    	x ^= k2 & (x ^ rotateRight(x, 16));
    	x ^= k4 & (x ^ rotateRight(x, 32));
    	return Bitboard{ x };
    }
    
    Bitboard Bitboard::rotiere45GradGegenUhrzeigersinn() const
    {
    	unsigned long long x = data;
    	const unsigned long long k1 = 0x5555555555555555ull;
    	const unsigned long long k2 = 0x3333333333333333ull;
    	const unsigned long long k4 = 0x0f0f0f0f0f0f0f0full;
    	x ^= k1 & (x ^ rotateRight(x, 8));
    	x ^= k2 & (x ^ rotateRight(x, 16));
    	x ^= k4 & (x ^ rotateRight(x, 32));
    	return Bitboard{ x };
    }
    

    ergibt:

    a8 und h1:
    h1:
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000001
    
    45 UZS
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000001
    00000000
    
    45 gUZS
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000001
    

    aber es sollte

    45 UZS
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000001
    

    rauskommen 😞



  • Nee, es soll genau das rauskommen was es ergibt.
    Schau doch wo die 7 landet bei
    http://chessprogramming.wikispaces.com/Flipping+Mirroring+and+Rotating#The whole Bitboard-Pseudo-Rotation by 45 degrees-Clockwise



  • OK. Ich will es aber wie in "Another pseudo rotation scheme was introduced by Robert Hyatt's rotated bitboards approach. While the 45 degree rotation looks more natural at the first glance, the calculations of this mapping is more complicated." haben.

    Was für einen rotier-Code muss ich dafür nehmen?

    Danke



  • OK, vergesst das. Da steht "A parallel prefix solution to map the normal occupancy to the visual rotated approach is left to the ambitious reader."


Log in to reply