如何允许或禁止按位操作

时间:2013-10-15 13:04:42

标签: c# bit-manipulation

我正在寻找某种类型,允许使用其他类型但不能自行执行标记/按位操作。

想象一下以下场景:

public enum Suit : byte
{
    Spades      = 0x00, // bits: xx00 xxxx
    Hearts      = 0x10, // bits: xx01 xxxx
    Diamonds    = 0x20, // bits: xx10 xxxx
    Clubs       = 0x30  // bits: xx11 xxxx
}

public enum Rank : byte
{
    Ace         = 0x01, // bits: xxxx 0001
    _2          = 0x02, // bits: xxxx 0010
    //  ...
    _10         = 0x0A, // bits: xxxx 1010
    Jack        = 0x0B, // bits: xxxx 1011
    Queen       = 0x0C, // bits: xxxx 1100
    King        = 0x0D  // bits: xxxx 1101
}

我想允许以下操作:

playingCardQueenOfHearts = Suit.Hearts| Rank.Queen;

但不是以下几点:

thisIsNonsenseInMyScenario = Suit.Spades | Suit.Hearts;
thisIsOdd = Rank.Jack | Rank.Ace;

enum可能不是最好的选择(事实上:它只允许我正在寻找的对手)。有没有其他类型,或某种方式来实现我正在寻找的东西?


我知道我可以演员表演(queenOfHearts = (byte)Suit.Hearts| (byte)Rank.Queen),但

一个。铸造允许任何事情:

thisIsWhat = (int)Suit.Spades | (int)DayOfWeek.Sunday;

湾我想限制,或至少制作相同类型的困难OR-ing元素:

thisIsNonsenseInMyScenario = Suit.Spades | Suit.Hearts;
thisIsOdd = Rank.Jack | Rank.Ace;

1 个答案:

答案 0 :(得分:3)

我会为此创建一个类型(可能是classstruct),例如

public struct Card
{
    public Suit Suit { get; private set; }
    public Rank Rank { get; private set; }
    public Card(Suit suit, Rank rank)
        : this()
    {
        this.Suit = suit;
        this.Rank = rank;
    }
    // include implementations for GetHashCode, Equals, ==, and !=
}

使用

Card queenOfHearts = new Card(Suit.Hearts, Rank.Queen);