最有效的方式来存储40张牌

时间:2012-07-29 18:46:47

标签: c#

我正在为40张牌的甲板游戏构建一个模拟器。甲板分为4个种子,每个种子有10张卡片。由于只有1个种子与其他种子不同(比方说,心脏),我认为有一种非常方便的方法来存储一组4个具有3位相同值的卡:前两个表示一个卡的数量是多少剩下给定的值,最后一个是一个标记,告诉该值的心卡是否仍然在牌组中。 所以,

{7h 7c 7s} = 101

这允许我将整个卡组存储在30位内存而不是40位。现在,当我用C编程时,我已经分配了4个字符(每个1字节= 32位),并使用值进行播放有位操作。 在C#中,我不能这样做,因为字符每个都是2个字节并且使用位更加困难,因此,问题是:我需要使用哪个最小的内存来存储所需的数据?

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

3 个答案:

答案 0 :(得分:2)

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

3个字节为您提供24位,而不是32位...您需要4个字节才能获得32位。 (好吧,某些平台有非8位字节,但现在它们很少见。)

  

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

是的,因此您使用byte代替char。您不应将char用于非文字信息。

  

和比特一起玩更痛苦

以什么方式?

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

  

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

虽然这是重要金额吗?如果事实证明你需要每个卡组存储8个字节而不是4个字节,这意味着800M而不是400M,其中100,000个。还不到一堆记忆。那不是 多......

答案 1 :(得分:1)

在C#中,与C / C ++不同,字节的概念不会因字符的概念而过载。

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

答案 2 :(得分:0)

C#(和现代版本的C)的类型恰好是8位:byte(或C中的uint8_t),所以你应该使用它。 C char通常是8位,但不保证,所以你不应该依赖它。

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