2016-10-04 3 views
0

Ich benutze die Bitfeld-Struktur unten, um den Board-Status eines Schachspiels zu speichern, es ist eine 32-Bit-Ganzzahl. Die Felder ich Codierung/Decodierung sind:Wert in Bitfeld-Variable setzen

  • epSquare (0 von 63)

  • Halbzuege zählen (0 bis 100)

  • Spielers (0 oder 1)

  • 4 Rochade Rechte Flaggen

ich erstellen kann und ext ract ‚Staaten‘, aber ich habe Probleme, einen bestimmten Zustand mutiert:

/* 
    0000 0000 0000 0000 0000 0011 1111 epSquare 0x3f 
    0000 0000 0000 0001 1111 1100 0000 halfMoves 0x7f >> 6 
    0000 0000 0000 0010 0000 0000 0000 curPlayer 0x1 >> 13; 
    0000 0000 0000 0100 0000 0000 0000 Kc 0x4000 
    0000 0000 0000 1000 0000 0000 0000 Qc 0x8000 
    0000 0000 0001 0000 0000 0000 0000 kc 0x10000 
    0000 0000 0010 0000 0000 0000 0000 qc 0x20000 
    */ 

public class State { 

    public static int new_state(int epSquare, int halfMoves, int turn, int flags){ 
     return epSquare | (halfMoves << 6) | (turn << 13) | flags; 
    } 

    public static int epSquare(int s){ 
     return s & 0x3f; 
    } 

    public static int halfMoves(int s){ 
    return s >> 6 & 0x7f; 
    } 

    // s state, e new epSquare 
    public static int setEPSquare(int s, int e){ 
    //?? 
    } 

    // s state, h halfMoves value 
    public static int setHalfMoves(int s, int e){ 
    //?? 
    } 

    public static void main (String[] args){ 
    int s = BoardState.new_state(36, 84, 1, 0); 
    System.out.println("ep square: " + epSquare(s)); //36 
    System.out.println("half moves: " + halfMoves(s)); //84 
    s = setHalfMoves(s, 13); 
    System.out.println("half moves: " + halfMoves(s)); //should give 13 
    } 
} 

Wie implementiere ich das setHalfMoves Methode? Der erste, setEPSquare, scheint zu funktionieren, aber ich konnte den ersteren nicht herausfinden. Vielen Dank!

+0

Was die Bedeutung der Parameter 'S' und 'e' und was wird diese Methode annehmen zurückzukehren? –

+0

s ist der Status und e ist der neue Wert für diesen Parameter (siehe Bearbeiten). – Fernando

+0

nm ... ich denke, ich habe es herausgefunden. – searchengine27

Antwort

2

Nun, erstens ist Ihre #setEPSquare() Funktion nicht korrekt. Wenn ich Ihnen den Code unten zeigen, könnten Sie verstehen, warum, aber ich werde auch erklären:

public static int setHalfMoves(int s, int e){ 
    return (
      //mask for e to only the correct bits 
      (e & 0x7f) 
      //left shifted into position 
      << 6) 
      //zero out the original value 
      | (s & (~(0x7f << 6))); 
} 
public static void main (String[] args){ 
    int s = BoardState.new_state(36, 84, 1, 0); 
    System.out.println("ep square: " + epSquare(s)); //36 
    System.out.println("half moves: " + halfMoves(s)); //84 
    //Note that this is fixed to now reassign s 
    s = setHalfMoves(s, 13); 
    System.out.println("half moves: " + halfMoves(s)); //should give 13 
} 

So Ihres erstes Problem ist, dass gegen die alten den neuen Wert ODER-Verknüpfung der falsche Betrieb ist. Sie müssen es für einen 'Set'-Funktionstyp auf Null setzen. Ihr zweites Problem war, dass Sie s neu zuweisen müssen, nachdem Sie es über setHalfMoves(int, int) manipulieren. Sie müssen auch #setEPSquare() beheben, aber ich lasse das für Sie ausprobieren.

+0

Ich denke ich habe es etwas anders gemacht, ich werde es posten, damit du es sehen kannst. Vielen Dank! – Fernando

1

Hier ist, was ich habe funktioniert, nicht sicher, ob es aber 100% richtig ist:

public static int setEpSquare(int s, int ep){ 
    s&= ~0x3f; 
    return s | ep ;  
} 

public static int setHalfMoves(int s, int h){ 
    s&= ~(0x7f << 6); 
    return s | (h << 6); 
} 
+0

vergiss ich falsch gelesen. Es ist im Grunde die gleiche genaue Sache wie meine Antwort – searchengine27

+0

Ok, ich werde deine Antwort akzeptieren, danke! – Fernando