1

私は40枚のカードのデッキゲーム用のシミュレーターを構築しています。デッキは4つのシードに分割され、それぞれに10枚のカードがあります。他のシード(たとえば、ハート)とは異なるシードが1つしかないため、同じ値の4枚のカードのセットを3ビットで格納する非常に便利な方法を考えました。最初の2つは、与えられた値が残り、最後の値はその値のハートカードがまだデッキにあるかどうかを示すマーカーです。それで、

{7h 7c 7s} = 101

これにより、デッキ全体を40ビットではなく30ビットのメモリに格納できます。Cでプログラミングしているときは、4文字(各1バイト= 32ビット)を割り当て、ビット演算で値を操作していました。 。C#ではそれができません。文字はそれぞれ2バイトであり、ビットで遊ぶのは非常に面倒なので、問題は、必要なデータを格納するために使用する必要のあるメモリの最小量はどれくらいかということです。

PS:システムのメモリにこれらのデッキを100k以上割り当てる必要があるかもしれないので、10ビットを節約するのはかなり大変だということを覚えておいてください。

4

3 に答える 3

2

Cでは、3文字を割り当てます(各1バイト= 32ビット)

3 バイトは 32 ビットではなく 24 ビットになります... 32 ビットを取得するには 4 バイトが必要です。(一部のプラットフォームには 8 ビット以外のバイトがありますが、最近ではほとんどありません。)

C#では、文字はそれぞれ2バイトであるため、それはできません

はい、byte代わりにを使用しますcharcharテキスト以外の情報には使用しないでください。

そして、ビットで遊ぶことははるかに苦痛です

どのように?

ただし、30 ビットを格納する必要がある場合は、intまたは を使用してuintください。または、データをでサポートする独自のカスタム値型を作成し、int適切なプロパティとコンストラクターを公開して、操作を改善することをお勧めします。

PS: システムのメモリにこれらのデッキを 100k 以上割り当てる必要があるかもしれないことに注意してください。

とはいえ、かなりの量ですよね?デッキごとに 4 バイトではなく 8 バイトを保存する必要があることが判明した場合、それは 100,000 に対して 400M ではなく 800M を意味します。まだメモリのギグ未満です。それだけじゃない

于 2012-07-29T18:55:00.670 に答える
1

C# では、C/C++ とは異なり、バイトの概念は文字の概念でオーバーロードされません。

.Net Framework の多くの API が特別にサポートしているbyteデータ型、特に a を確認してください。byte[]

于 2012-07-29T18:54:36.323 に答える
0

C# (および C の最新バージョン) には、正確に 8 ビットbyte(またはuint8_tC) の型があるため、それを使用する必要があります。Ccharは通常 8 ビットですが、保証されていないため、それに依存するべきではありません。

C# では、実際の文字や文字列を扱う場合にのみcharandを使用し、数値として扱わないでください。string

于 2012-07-29T18:54:27.947 に答える