2016-11-16 18 views
2

체스 엔진에 비트 보드를 구현하는 올바른 방법이 무엇일까 궁금합니다. 지금까지 나는 체스 엔진 프로그래밍의 기초에 대한 연구를 수행하고 미니 노트, 알파벳순, 정지 검색 및 고급 평가 기능과 같은 몇 가지 노트를 사용했습니다.비트 보드를 올바르게 사용하는 방법

는 그럼 난은 3 개 부분으로 내 프로젝트를 분할 :

  • GUI
  • 보드 표현
  • 는 최소 최대를 넘어 검색을 구현하고 정적 위치에 대한 괜찮은 평가 함수에 오는

게시판을 나타낼 때와 gametree를 계산할 때 모두 시간을 절약하기 위해 보드 상태를 나타내는 데 bitboards를 사용하고 있습니다. 이것은 내 문제가있는 곳입니다.

누군가 다른 사람의 코드를 복사하고 싶지 않았기 때문에 나는 이것을 시험해보기 위해 unsigned long을 만들려고 노력했지만, 단 하나의 비트는 잃어 버렸습니다. 여기

코드입니다 :

public static void main(String[] args) { 
    Long bitBoard = Long.parseUnsignedLong("9223372036854775807"); 

    System.out.println("Number of bits in this 64-bit unsigned long: " + Long.bitCount(bitBoard)); 
    System.out.println(Long.MAX_VALUE); 
} 

누군가가 내가 뭘 잘못했는지에 관해서는 저에게 힌트를 줄 수, 그리고 왜 내가 조금 잃고?

+0

그래서 기본적으로 최대 값을 길게 입력하려고 시도한 다음 프로그램에 '1'비트 수를 알려주었습니다. 나는 그것이 나에게 64를 줄 것으로 예상했다. 그러나 그것은 그것을 거부했다. 그리고 단지 나에게 내가 기대했던 것보다 1 작은 63를 줬다. 혼란스러운 ... – JavaIsMyBae

+0

최대 긴 숫자를 1 씩 증가 시키면 도움이되지 않습니다. 그럴 경우 Long.bitCount() 메서드는 '1'을 반환합니다. – JavaIsMyBae

답변

0

자바에서는 Long이 항상 서명되며 첫 번째 비트 (손실 된 것)가 양수인지 음수인지를 결정합니다. Long.parseUnsignedLong(...)은 전달한 값이 양수이고 실제로 데이터 유형을 부호없는 long으로 변환하지 않는다는 것을 확인합니다.

EDIT : Nevermind. 위의 진술은 올바르지 않습니다. 문제는 서명 된 Long에 최대 값을 사용한다는 것입니다. 부호없는 long의 최대 값은 18446744073709551615입니다.