Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用非常小的值保存字节数组_C++_Bytearray - Fatal编程技术网

C++ 使用非常小的值保存字节数组

C++ 使用非常小的值保存字节数组,c++,bytearray,C++,Bytearray,如果我有两个数字,比如4和2,我想保存到一个文件中。两者都是int类型,因此它们每个应该占用4个字节 但是,由于数字太小,只能用2位和4位来表示,这难道不是浪费空间吗 是否有任何技术可以帮助您在同一空间中打包更多的数字 int占4字节 如果需要2字节无符号整数,请使用WORD(uint16\t) 也许你可以试试shortshort仅从内存中提取一个字节,而不是两个字节 在程序中,可以使用if来决定要写入文件的表单 if (aNumber > SHRT_MAX || aNumber <

如果我有两个数字,比如4和2,我想保存到一个文件中。两者都是
int
类型,因此它们每个应该占用4个字节

但是,由于数字太小,只能用2位和4位来表示,这难道不是浪费空间吗

是否有任何技术可以帮助您在同一空间中打包更多的数字

  • int占4字节
  • 如果需要2字节无符号整数,请使用WORD(uint16\t)

  • 也许你可以试试
    short
    short
    仅从内存中提取一个字节,而不是两个字节

    在程序中,可以使用
    if
    来决定要写入文件的表单

    if (aNumber > SHRT_MAX || aNumber < SHRT_MIN) write(aNumber);
    else write((short)aNumber);
    
    if(aNumber>SHRT_MAX | | aNumber

    希望这会有所帮助。

    使用位字段可以做到这一点,这将允许您创建更紧凑的数据。 例如:

    typedef struct {
       unsigned int first:3;
       unsigned int second:3;
       unsigned int third:3; //and so on
    } PackedData;
    ...
    PackedData a;
    a.first = 4;
    a.second = 2;
    
    这将创建一个包含三个3位数字的数据类型。您可以将其扩展到足以填充int

    这有两个问题:

  • 您必须减少访问位字段的开销-大量移位和 位掩码操作
  • 您不能以任何数组格式访问数据。无法指向位字段项的指针

  • 其他信息:

    要将上述结构写入文件,只需将PackedData变量类型转换为(无符号)int类型,然后将其保存到文件中。当您想要读取它时,您可以将其读取为(无符号)int,然后将其类型转换回PackedData

    不过需要注意的是,只有在保存和读取数据的系统都使用相同的endianness时,这种方法才有效。否则,数据将被反转



    关于你问题的另一点,如果你有数字4,你至少需要3位来存储你的数据。

    int
    在现代系统中通常是4字节,而不是2字节。是的,这叫做位压缩。只要你知道你的所有数字都有一定的大小,你就可以这样做。谢谢,我会更正它。如果你想把它发挥到极致(不使用压缩),你可以使用7位(编辑:5位)保存这两个数字。然而,考虑到大约100000000字节的闪存成本为1美元,你真的认为它值得吗?@Matt-:grins:-看起来我们一开始都犯了一个计算错误@马特如果你只想存储4和2,那么你可以使用一个位。但是如果你想存储,比如说0,那么你就不能将数字4存储在2位中。很抱歉,我大脑出了个屁,忘记了4在普通二进制中是3位。你在上一次评论中就诅咒了。这应该教会我写作时不要这么匆忙。实际上,您的解决方案可能很有用。因为我想到的是一个由非常小的数字组成的非常大的序列。所以我可以用一种贪婪的方式来确定一个数字必须是什么类型,并将其保存到文件中。嗨,Dmitri,这不仅仅是为了保存这些数字我应该使用什么,而是关于是否有办法将它们打包到同一个空间中的更多信息。例如,不是,你有两个数字1和2(0000 0001)(0000 0000 0010)将它们打包为2个字节(0000 0000 0001 0000 0010)我怎么知道这2个数字1和2或数字65538???这是很难的部分。否则我可以把它们并排放在一个很长的流中。以后一定有办法找回原始数字。你怎么知道流中有多少数字???1或2?然后你必须保留另一个变量来指示存储的变量B的数量les.ie这没有任何意义。我知道它没有意义,但它产生了一些有用的东西。Tom的回答教会了我,希望其他人也能学到一些新的东西。不,short至少需要两个字节。char只需要一个字节。嗨,Wind,这并不是我真的担心这些数字将占用多少空间。我只是想知道为什么我要浪费这么多比特来完成这样的任务小数字。好吧,我理解错了。但只有当你有很多小数字的时候,你才想打包。