C ++:可伸缩的数字类 - bitset< 1> *或unsigned char *

时间:2011-11-29 01:28:19

标签: c++ numbers byte bits integer

我打算创建一个数字课程。目的是保留任意数量的数字,而不必担心过多(如使用int或long)。但同时没有太多使用。例如:

如果我的数据只需要1-10,我不需要int(4个字节),short(2个字节)或者char(1个字节)。那么为什么分配这么多? 如果我想要保存需要极大数量的数据(在这种情况下只有整数),就像过去数十亿,我不能。 我的目标是创建一个数字类,可以像字符串一样处理这个问题,调整大小以适应数字。但在我开始之前,我想知道......

bitset< 1&gt ;,bitset是一个模板类,它允许我在C ++中使用微数位,非常有用,但它是否有效?,bitset< 1>将定义1位,但我想制作它们的数组吗? C ++可以分配最小字节,bitset< 1>分配一个字节并提供该位的1位OF?如果是这样的话,我宁愿使用unsigned char *创建我的数字类。

unsigned char,或者BYTE保存8个字节,0到256之间只需要一个,更多需要2个,然后是3个,它只需要在字节间隔而不是位间隔时继续扩展。

你觉得哪个更有效率?如果bitset实际分配了1位,那么这些位会让我觉得它甚至不可能。实际上,在32位处理器上分配字节直到4字节(32位)实际上更有效32位分配是最有效的,因此从那时起我将一次使用4个字节。

基本上我的问题是,你有什么想法?我该怎么做这个实现,bitset< 1>或unsigned char(或BYTE)?

3 个答案:

答案 0 :(得分:2)

除非你的目标架构是DigiComp-1,否则优化比特是很愚蠢的。读取单个位总是慢于读取整数 - 4位不比8位有效。

如果要将其作为十进制数存储,请使用unsigned char。这将是最有效的。

或者,您可以使用GMP

答案 1 :(得分:1)

bitset模板的模板参数需要编译时的const整数。当您必须在运行时确定最大位大小时,这可能是一个缺点。另一件事是大多数编译器/库使用unsigned intunsigned long long来存储这些位以便更快地访问内存。如果您的应用程序将在内存有限的环境中运行,您应该创建一个新的类,如bitset或使用不同的库。

答案 2 :(得分:1)

虽然它无法直接帮助您对巨型数字进行算术运算,但如果这种节省空间是您的目标,那么您可能会发现我的Nstate库很有用(增强许可证):

http://hostilefork.com/nstate/

例如:如果你有一个介于0和2之间的值...那么只要你将一堆这些存储在一个数组中,就可以利用未使用的第四个“浪费”的空间state(3)包含更多值。在这种特殊情况下,你可以在一个32位字中得到20个三态,而不是每个三态2位得到的16个。

相关问题