2016-11-08 77 views
1

我正在C#中进行Gomoku实现,该项目的第一个挑战是智能地表示董事会的状态。在C#中对位字段执行加法操作#

为了实现这个目标,我决定把位字段代表组合的价值:

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

,我无意中发现了这个问题,就是当我想增加一个组合,我想取消设置前一位,并设置一个新的,这基本上是一个二进制左移,这是不允许与枚举。 例如,假设我有两个棋子的组合,并且旁边放置一个棋子,所以枚举的值必须变成“ThreePawn”而不是“TwoPawns”。

所以基本上,我想要做的是TwoPawns + OnePawn == ThreePawns。

什么是最有效的方式来实现这种行为?

+0

您可以将枚举强制转换为整数,然后执行任何您想要的数学运算。 – jdweng

+3

如果'ThreePawn'将是'3'而不是'4',那么它们都不会像你所期望的那样工作吗?另外,如果你想进行位移,则将其转换为基础类型,在本例中为'byte'。 – CodeCaster

+0

so'TwoPawns + ThreePawn = FivePawns'?我不明白你是如何从2 + 6中获得16甚至8的。 – Slai

回答

0

这不是应该如何使用标志。标志用于指示开关在一个单一的字节,所以给定的二进制0000第一比特代表一个元素“上”时,所述第二不同的元件等

所以元素1由下式表示:1 = 0001,元素2 :2= 0010,Element3:4 = 0100等。因此,要使用二进制001131+2)来关闭元素1和元素2。

仅供参考;这可以追溯到计算机具有有限内存并且能够以少量位表示多个状态的时代是有利的。

从二元角度来看,你想要什么是没有意义的,三个虾将是0011或开关1和2.这不是一个真正的“状态”。这是交换机的用途。

如果你想指定虾的数量和perfrom添加,有什么不好的旧时尚int

+0

我的直觉是我使用的位域不合适。用你的答案很明显,一个整数会好得多。谢谢 ! – Toto

+0

@Anonymouss最好的表达方式是在您认为合适的时候标记为答案和/或upvote – Liam

1

如果我理解正确的话,那么你可以这样做:

CombinationValue result = CombinationValue.OnePawn | CombinationValue.TwoPawns; 

但是你需要有ThreePawn为3即可。