1

我正在为 40 张纸牌游戏构建一个模拟器。牌组分为 4 个种子,每个种子有 10 张牌。由于只有 1 个种子与其他种子不同(比如说,红心),我想到了一种非常方便的方法来存储一组 4 张具有相同值的 3 位卡片:前两个表示一个卡片有多少张给定的值被留下,最后一个是一个标记,表明该值的心卡是否仍在套牌中。所以,

{7h 7c 7s} = 101

这使我可以将整个卡组存储在 30 位而不是 40 位的内存上。现在,当我在 C 中编程时,我会分配 4 个字符(每个 1 字节 = 32 位),并使用位操作来处理这些值. 在 C# 中我不能这样做,因为每个字符都是 2 个字节,并且使用位更痛苦,所以,问题是:我必须用来存储所需数据的最小内存量是多少?

PS:请记住,我可能必须在系统内存中分配 100k+ 的这些卡座,因此节省 10 位是相当多的

4

3 回答 3

2

在 C 中,我会分配 3 个字符(每个 1 字节 = 32 位)

3 个字节为您提供 24 位,而不是 32 位……您需要 4 个字节才能获得 32 位。(好吧,有些平台有非 8 位字节,但如今它们非常罕见。)

在 C# 中我不能这样做,因为每个字符都是 2 个字节

是的,所以你使用byte而不是char. 您不应该使用char非文本信息。

玩比特更痛苦

以什么方式?

但如果您需要存储 30 位,只需使用 anint或 a uint。或者,更好的是,创建您自己的自定义值类型,它使用支持数据int,但公开适当的属性和构造函数以使其更好地使用。

PS:请记住,我可能必须在系统内存中分配 100k+ 的这些卡座,因此节省 10 位是相当多的

不过,这是一笔可观的金额吗?如果结果证明您需要为每个卡座存储 8 个字节而不是 4 个字节,这意味着 100,000 个卡座是 800M 而不是 400M。仍然比内存少。那不是那么多...

于 2012-07-29T18:55:00.670 回答
1

在 C# 中,与 C/C++ 不同的是,字节的概念不会被字符的概念重载。

查看byte数据类型,尤其是 a byte[],.Net Framework 中的许多 API 都对其有特殊支持。

于 2012-07-29T18:54:36.323 回答
0

C#(和现代版本的 C)有一个正好是 8 位的类型:(byteuint8_t在 C 中),所以你应该使用它。Cchar通常是 8 位,但不能保证,所以你不应该依赖它。

在 C# 中,您应该char在处理实际字符和字符串时使用and ,不要将它们视为数字。string

于 2012-07-29T18:54:27.947 回答