2016-10-04 10 views
0

체스 게임의 보드 상태를 저장하기 위해 비트 필드 구조를 사용하고 있습니다. 32 비트 정수입니다. 입/복호화를 코딩있어 필드는 :비트 필드 변수의 값을 설정하십시오.

  • epSquare (63 0)

  • 반 이동 (0 ~ 100)

  • 현재 플레이어 (0 또는 1)

  • 카운트
  • 4 개 캐슬 링 권리 플래그

내가 만들 수 있습니다

및 내선

/* 
    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 
    } 
} 

가 어떻게이 setHalfMoves 방법을 구현합니까 : RACT '상태',하지만 난 문제가 주어진 상태를 돌연변이가 있어요? 첫번째 것, setEPSquare는 작동하는 것처럼 보이지만, 나는 이전 것을 알아낼 수 없었다. 감사!

+0

매개 변수의 의미's'와'e' 및이 방법이 무엇인지를 생각한다 무엇을 반환하는거야? –

+0

s는 상태이고 e는이 매개 변수의 새 값입니다 (편집 참조). – Fernando

+0

nm ... 나는 그것을 이해했다고 생각합니다. – searchengine27

답변

2

음, 먼저 #setEPSquare() 기능이 올바르지 않습니다. 나는 아래 당신에게 코드를 표시 할 때, 당신은 이유를 알 수 있지만, 나뿐만 아니라 설명합니다 :

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 
} 

그래서 첫 번째 문제 이전에 대한 새로운 가치를 논리합 연산하는 것은 잘못된 동작 것입니다. '설정'유형의 기능을 사용하려면이 값을 0으로 설정해야합니다. 두 번째 문제는 setHalfMoves(int, int)을 통해 조작 한 후 s을 재 할당해야한다는 것이 었습니다. #setEPSquare()도 수정해야하지만 시험 사용해 볼 수는 있습니다.

+0

나는 그것을 약간 다르게 생각한다. 내가 볼 수 있도록 게시 할 것이다. 감사! – Fernando

1

여기 내가 비록 100 % 맞습니다하지 않도록 경우, 작업있어 무엇 :

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

오해하지 마십시오. 기본적으로 내 대답과 똑같은 내용입니다 – searchengine27

+0

좋아, 답장을 수락하겠습니다. 감사합니다! – Fernando