我正在为40张牌的甲板游戏构建一个模拟器。甲板分为4个种子,每个种子有10张卡片。由于只有1个种子与其他种子不同(比方说,心脏),我认为有一种非常方便的方法来存储一组4个具有3位相同值的卡:前两个表示一个卡的数量是多少剩下给定的值,最后一个是一个标记,告诉该值的心卡是否仍然在牌组中。 所以,
{7h 7c 7s} = 101
这允许我将整个卡组存储在30位内存而不是40位。现在,当我用C编程时,我已经分配了4个字符(每个1字节= 32位),并使用值进行播放有位操作。 在C#中,我不能这样做,因为字符每个都是2个字节并且使用位更加困难,因此,问题是:我需要使用哪个最小的内存来存储所需的数据?
PS:请记住,我可能需要在系统内存中分配100k +的这些卡座,因此节省10位是非常多的
答案 0 :(得分:2)
在C中,我已经分配了3个字符(每个1字节= 32位)
3个字节为您提供24位,而不是32位...您需要4个字节才能获得32位。 (好吧,某些平台有非8位字节,但现在它们很少见。)
在C#中我不能这样做,因为字符每个都是2个字节
是的,因此您使用byte
代替char
。您不应将char
用于非文字信息。
和比特一起玩更痛苦
以什么方式?
但是如果你需要存储30位,只需使用int
或uint
。或者,更好的是,使用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#中,在处理实际字符和字符串时,您应该只使用char
和string
,不要将它们视为数字。