2017-04-03 17 views
1

ポーカーデッキ52効率的な手の表現と評価ポーカーハンド表現と評価

A K Q J T 9 8 7 6 5 4 3 2 
scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh 

52ビット

として、AC、Qsの上に作業カード
13ランク及び4スーツ

Qh、8s、7s 6s

A K Q J T 9 8 7 6 5 4 3 2 
scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh scdh 
1 1  1 1    1 1 1 

It 9枚のカード36ビットで破壊されることは
私がこれは私が削除する必要があります知ってはいけない修正
だと思う私はUInt64型と同じ問題

を試してみました

byte s = 1; 

UInt16 spades4 = (UInt16)((s << 12) + (s << 8) + (s << 4) + (s & 0xff)); 
Debug.WriteLine("Hexadecimal value of {0} is {1} {2}", spades4, String.Format("{0:X}", spades4), Convert.ToString(spades4, 2).PadLeft(16, '0')); 
Debug.WriteLine(""); 

UInt32 spades8 = (UInt32)((s << 28) + (s << 24) + (s << 20) + (s << 16) + (s << 12) + (s << 8) + (s << 4) + (s & 0xff)); 
Debug.WriteLine("Hexadecimal value of {0} is {1} {2}", spades8, String.Format("{0:X}", spades8), Convert.ToString(spades8, 2).PadLeft(32, '0')); 
Debug.WriteLine(""); 

Int64 spades9 = (Int64)((s << 30) + (s << 28) + (s << 24) + (s << 20) + (s << 16) + (s << 12) + (s << 8) + (s << 4) + (s & 0xff)); 
Debug.WriteLine("Hexadecimal value of {0} is {1} {2}", spades9, String.Format("{0:X}", spades9), Convert.ToString(spades9, 2).PadLeft(36, '0')); 
Debug.WriteLine(""); 

// once the shift is up to 31 it breaks - it goes negative 
Int64 spades9b = (Int64)((Int64)(s << 31) + (Int64)(s << 28) + (Int64)(s << 24) + (Int64)(s << 20) + (Int64)(s << 16) + (Int64)(s << 12) + (Int64)(s << 8) + (Int64)(s << 4) + (Int64)(s & 0xff)); 
Debug.WriteLine("Hexadecimal value of {0} is {1} {2}", spades9b, String.Format("{0:X}", spades9b), Convert.ToString(spades9b, 2).PadLeft(36, '0')); 
Debug.WriteLine(""); 

最後のセットまでで結構です

Int64 spades9b = (Int64)(((Int64)s << 44) | ((Int64)s << 40) | ((Int64)s << 36) | ((Int64)s << 32) | (Int64)(s << 28) | (Int64)(s << 24) | (Int64)(s << 20) | (Int64)(s << 16) | (Int64)(s << 12) | (Int64)(s << 8) | (Int64)(s << 4) | (Int64)(s & 0xff)); 
Debug.WriteLine("Hexadecimal value of {0} is {1} {2}", spades9b, String.Format("{0:X}", spades9b), Convert.ToString(spades9b, 2).PadLeft(48, '0')); 
+0

私はこれが修正だと思います((Int64)s << 32) – Paparazzi

+0

ポーカーハンド評価の非常に効率的なアルゴリズムが既に存在するので、うまくいけばうまくいけばうれしいです。 – Evk

+0

@エヴァークC#で私に1つを指摘できますか? – Paparazzi

答えて

0
  1. 間違いなくあなたがやっている、sを含むすべてのために(UInt64型を使用し、これを任せますまた、...
  2. +の代わりに|を使用します。これは、ビット単位の操作ではより慣れているためです。署名されたInt64の場合、正の最大数が範囲の半分であるため、+はおそらくあなたにいくつかの問題を引き起こしています。

問題が残っている場合は、新しいコードと出力内容を投稿してください。

+0

バイトs = 1。アップデートの質問をご覧ください。 – Paparazzi

0

問題のこれらの種類に簡単な解決策は以下のとおりです。

  • は、値のいずれか列挙してください。
  • 今日、私たちがそれを何と呼んでいても、色彩/記号の列挙を1つ作成してください。
  • 各値のいずれかをとる構造体、クラスまたはタプルを作成します。
  • デッキと各プレイヤーの手は、その構造体、クラス、またはタプルのリストです。リストから要素を削除する方が簡単なので、リストを使用します。

1つの整数にエンコードすることができます。しかし、私はそれを助言しません。もちろんあなたの質問はメモリ内の値の型の特定の実装についてであり、ポーカーの手に関するものではないかもしれないので、私は完全にオフかもしれません。

+0

ビットマスキングと私がJavaライブラリで見つけたいくつかのトリックを使って、より速いエレベーターを作ろうとしています。使い易さは何百万人もの手にとって十分速いものではありません。 – Paparazzi

関連する問題