2016-11-08 4 views
1

저는 C#에서 Gomoku 구현을 진행하고 있으며 프로젝트의 첫 번째 과제는 보드 상태를 지능적으로 표현하는 것입니다.C#에서 비트 필드 추가 수행

이 목표를 달성하기 위해

, 나는 조합의 값을 나타내는 비트 필드로 전환하기로 결정

[Flags]   
public enum CombinationValue : byte 
{ 
    OnePawn = 1, 
    TwoPawns = 2, 
    ThreePawn = 4, 
    FourPawn = 8, 
    FivePawns = 16 
} 

I가 발견 문제이며, 그 나는 조합을 증가하고자 할 때 , 나는 이전 비트를 설정 해제하고 기본적으로 enum으로 허용되지 않는 왼쪽으로 바이너리 시프트 인 새 값을 설정하려고합니다. 예를 들어 두 폰의 조합이 있고 그 옆에 폰이 놓여져 있으므로 열거 형 값이 "TwoPawns"대신 "ThreePawn"이되어야합니다.

기본적으로 내가하고 싶은 것은 TwoPawns + OnePawn == ThreePawns입니다.

이 동작을 구현하는 가장 효율적인 방법은 무엇입니까?

CombinationValue result = CombinationValue.OnePawn | CombinationValue.TwoPawns; 

을하지만 당신은 다음 3으로 ThreePawn가 필요합니다 :

+0

열거 형을 정수로 형변환 한 다음 원하는 수학을 수행 할 수 있습니다. – jdweng

+3

'ThreePawn'이'4'가 아니라'3'이라면, 예상대로 작동하지 않을까요? 또한, 비트 시프트를 원할 경우 기본 유형 (이 경우 '바이트')으로 캐스트하십시오. – CodeCaster

+0

그래서'TwoPawns + ThreePawn = FivePawns'입니까? 나는 2 + 6에서 16 또는 8을 얻을 수있는 방법을 모르겠다. – Slai

답변

0

이것은 플래그를 사용하는 방법이 아닙니다. 플래그 때문에 주어진 단일 바이트 , 스위치를 지정하는데 사용되는 첫 번째 비트 그래서에서 element1 의해 표현 된 요소 "상에"있다고 번째 다른 소자 등

나타내는 이진 0000 : 1 = 0001,이 element2을 : 2= 0010, Element3 : 4 = 0100 등입니다. 따라서 요소 1과 요소 2를 켜려면 이진 0011 또는 3 (1+2)을 사용하십시오.

참고 문헌; 이것은 컴퓨터가 제한된 메모리를 가지며 적은 수의 비트로 다수의 상태를 나타낼 수있는 시대로 거슬러 올라갑니다.

원하는 것은 이진 관점에서 이해가되지 않습니다. 세 새우는 0011이거나 스위치 1과 2입니다. 이것은 실제로 "상태"가 아닙니다. 그것은 스위치가있는 것입니다.

새우 수와 새우 수를 지정하려면 좋은 오래된 패시브로 무엇이 잘못 되었습니까? int?

+0

필자는 비트 필드를 사용한 것이 부적절하다는 직관을 가지고있었습니다. 여러분의 대답으로 정수가 훨씬 더 낫다는 것이 아주 분명합니다. 감사 ! – Toto

+0

@Anonymouss 감사의 말을하는 가장 좋은 방법은 적절한 것으로 응답 및/또는 upvote로 표시하는 것입니다. – Liam

1

내가 제대로 이해한다면, 당신은이 작업을 수행 할 수 있습니다.