在C#中对位字段执行加法

时间:2016-11-08 13:15:25

标签: c# enums bit-fields

我正在使用C#进行Gomoku实现,该项目的第一个挑战是智能地表示董事会的状态。

为了实现这一目标,我决定转向位域来表示组合的价值:

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

我偶然发现的问题是,当我想要增加一个组合时,我想取消设置前一位并设置一个新的,这基本上是左边的二进制移位,这是enum不允许的。 例如,假设我有两个棋子的组合,并且旁边放置一个棋子,因此枚举的值必须变为" ThreePawn"而不是" TwoPawns"。

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

实现此行为的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

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

Dim Testarray(10) As String
Testarray(5) = "Test"
For i = 0 To UBound(Testarray)
    If Testarray(i) = vbNullString Then
        ' skip
    Else
        Cells(i + 1, 1).Value = Testarray(i)
    End If

Next

但是你需要将ThreePawn设为3。

答案 1 :(得分:0)

这不是应该如何使用标志。标志用于在单个字节中指定开关,因此,给定二进制0000,第一位表示元素为" on",第二位表示不同的元素,等等。

所以element1由:1 = 0001,Element2:2= 0010,Element3:4 = 0100等表示。因此,要转换元素1和元素2,请使用二进制{{1} }或00113)。

FYI;这可以追溯到计算机内存有限并且能够以少量位表示多个状态的日子是有利的。

从二元的角度来看,你想要的是没有意义的,三只虾将是1+2或开关1和2.这不是一个真正的状态&#34 ;。这是交换机的用途。

如果你想指定虾的数量和增加的数量,那么一个好的旧时代0011会出现什么问题?