2016-11-08 2 views
1

私はC#でGomokuの実装を行っていますが、プロジェクトの最初の課題はボードの状態を知的に表現することです。C#のビットフィールドの追加を実行する

この目標を達成するために、私は、組み合わせの値を表すためのビットフィールドに回すことにしました:、

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

私がつまずいた問題を、私は組み合わせをインクリメントしたい場合ということです私は前のビットを解除し、新しいものを設定したい。これは、基本的に左へのバイナリシフトであり、enumでは許されない。 たとえば、2つのポーンの組み合わせがあり、ポーンがその隣に置かれているので、列挙の値は "TwoPawns"ではなく "ThreePawn"になる必要があります。

基本的に、私がしたいのはTwoPawns + OnePawn == ThreePawnsです。

この動作を実装する最も効率的な方法は何でしょうか?

CombinationValue result = CombinationValue.OnePawn | CombinationValue.TwoPawns; 

をしかし、あなたは、その後3としてThreePawnを持っている必要があります。

+0

列挙型を整数にキャストして、任意の数式を実行できます。 – jdweng

+3

'ThreePawn'が' 4'ではなく '3'ならば、期待通りに動作しませんか?また、ビットシフトしたい場合は、基底の型にキャストします。この場合は 'byte'です。 – CodeCaster

+0

だから 'TwoPawns + ThreePawn = FivePawns'?私はあなたが2 + 6から16または8を得る方法を見ていません – Slai

答えて

0

これはフラグの使用方法ではありません。エレメント2は、1 = 0001:フラグは

そこでエレメント1が表されるなど、異なる要素第ので、バイナリ0000所与の最初のビットが「ON」である要素を表し、スイッチシングルバイトでを指定するために使用されています:2= 0010、Element3:4 = 0100などです。要素1と要素2を有効にするには、バイナリ0011または31+2)を使用します。

FYI;これは、コンピュータのメモリが限られていて、少数のビットで複数の状態を表すことができた時代に至っています。

バイナリの観点から、あなたが望むものは、0011またはスイッチ1と2の3つのエビがあります。これは本当に「状態」ではありません。これはスイッチのためのものです。

新鮮な魚介類の数を指定したい場合は、古き良きファッショナブルなものは何ですか?int

+0

私はビットフィールドの私の使用が不適切であるという直感を持っていました。あなたの答えでは、整数がはるかに優れていることは非常に明白です。ありがとう! – Toto

+0

@Anonymouss感謝の言葉を述べる最良の方法は、あなたが適切だと思うように回答および/またはupvoteとしてマークすることです – Liam

1

私が正しくあなたを理解していれば、あなたはこれを行うことができます。

関連する問題