代码之家  ›  专栏  ›  技术社区  ›  w00d

C++ 2.5字节(20位)整数

  •  4
  • w00d  · 技术社区  · 16 年前

    Vector< int20 > 、操作员过载等。。

    10 回复  |  直到 10 年前
        1
  •  9
  •   aioobe    16 年前

    如果存储是您主要关心的问题,我怀疑您需要相当多的20位变量。把它们成对存放怎么样?你可以的 创建一个表示两个这样的变量的类

    为了方便地访问变量,您可以重写[]-运算符,这样您就可以编写:

    int fst = pair[0];
    int snd = pair[1];
    

    因为您可能希望允许诸如

    pair[1] += 5;
    

    参考 . 但是,您不能返回对备份字节的直接引用(因为它会弄乱它的相邻值),因此您实际上需要返回一个 备份字节的代理 (这反过来又引用了backing字节)并让代理重载相关的操作符。

    事实上,正如@Tony所建议的,您可以将其概括为一个包含N个这样的20位变量的通用容器。

    (我自己做过一个专门化的向量,用于有效存储布尔值(作为单个位)。)

        2
  •  6
  •   Tony Delroy    16 年前

    也就是说,让我们抓住救命稻草。。。

    struct Proxy
    {
        Int20_Container& container_;  // might not need if a singleton
        Int20_Container::size_type index_;
        ...
    };
    

    也有可能,虽然您的值在20位的空间范围内,但在实际使用中,您只有不到64k个不同的值。如果您对数据集有这样的了解,可以创建一个查找表,其中16位数组索引映射到20位值。

        3
  •  4
  •   BatchyX    16 年前

    使用类。只要你尊重复制/分配/克隆等。。。STL语义,你不会有任何问题。

        4
  •  3
  •   Potatoswatter    16 年前

    使用位域。(我真的很惊讶没有人提出这个建议。)

    struct int20_and_something_else {
        int less_than_a_million : 20;
        int less_than_four_thousand : 12; // total 32 bits
    };
    

    这只适用于结构中元素的相互优化,您可以使用其他数据消除间隙。但效果很好!

    如果您真的需要优化一个由20位数字组成的庞大数组,而不需要其他任何东西,那么:

    struct int20_x3 {
        int one : 20;
        int two : 20;
        int three : 20; // 60 bits is almost 64
    
        void set( int index, int value );
        int get( int index );
    };
    

    如果愿意,可以添加getter/setter函数使其更漂亮,但是不能获取位字段的地址,而且它们不能参与数组。(当然,您可以拥有 struct .)

    用作:

    int20_x3 *big_array = new int20_x3[ array_size / 3 + 1 ];
    
    big_array[ index / 3 ].set( index % 3, value );
    
        5
  •  2
  •   log0    16 年前

    std::bitset . 将所有内容存储在位集中,并使用正确的索引(x20)访问数据。

        6
  •  1
  •   Necrolis    16 年前

    你不可能得到一个类型正好20位(即使使用位压缩结构),因为它总是与一个字节对齐(最小粒度)。如果必须有20位,唯一的方法就是创建一个位流来处理数据(可以重载以接受索引等)

        7
  •  1
  •   Matt user129975    10 年前

    union 关键字创建位字段。我早在需要位字段的时候就用过了。否则,您可以创建一个包含3个字节的类,但通过按位操作只会暴露最重要的20个字节。

        8
  •  0
  •   Douglas Leeder    16 年前

    据我所知那是不可能的。

    为了获得更好的存储密度,可以在一个int64\t值中存储3 int20。

        9
  •  0
  •   alxx    16 年前

    只是一个想法:使用优化的存储(两个实例5个字节),对于操作,将其转换为32位int,然后再转换回来。

        10
  •  0
  •   James Anderson    16 年前

    虽然有很多方法可以做到这一点。 一种可能的方法是使用位抖动将它们存储为一个5字节数组的左右两部分,该数组具有一个要存储/检索的类,该类将所需数组项转换为字节5[]数组中的数组项,并根据需要提取左右半部分。

    然而,在大多数硬件上,整数需要字对齐,因此,为了提取整数,还需要进行位旋转,以便正确对齐整数。

    我认为增加交换空间并让虚拟内存来处理大数组会更有效(毕竟20比32并不能节省太多!)总是假设你有一个64位操作系统。