将1到32位数附加到char缓冲区

我有一个char*缓冲区,我想追加各种位大小( 132之间)的整数。

因此,我需要一个function:

 void addBits(char *buffer, int bits_appended_so_far, int object, int object_bit_size); 

可以将13位的对象移动到缓冲区的第470位位置。

我当然可以将这些位逐个移到缓冲区,但速度至关重要,因此看起来应该可以一次移动更大的块。 有没有标准的方法来做到这一点? 似乎应该有一个标准的方法,但一些谷歌搜索和搜索没有给我我想要的东西。

这样的事情怎么样:

 void addBits(char *buffer, int bits_appended_so_far, int object, int object_bit_size) { int* int_buffer = reinterpret_cast(buffer); const int bits_per_int = 8 * sizeof(int); int current_int = bits_appended_so_far / bits_per_int; int current_offset = bits_appended_so_far % bits_per_int; int_buffer[current_int] |= object << current_offset; if( current_offset ) int_buffer[current_int+1] |= object >> (bits_per_int - current_offset); } 

这假设object仅设置了最不重要的object_bit_size位,否则您需要添加一个步骤来关闭额外(不需要的)位。 它还假定在开始添加位之前将缓冲区初始化为零。

  • 使用shift在32位int中正确对齐位。
  • 找到缓冲区中字节的位置。
  • 如果需要保留缓冲区的内容,则创建指向相关字节的int指针,然后按位| 进入该位置的32位int。
  • 如果不需要保留内容,只需memcpy(缓冲区位置,32位int);

最简单的解决方案似乎是使用基本的memcpy并在位置不是字节对齐时适当地移位

标准字大小为1,2,4,8和16字节取决于CPU,因此您一次只能移位8,16,32,64或128位。 没有标准方法!

如果您不想使用内存空间,那么我的建议就是将一个字节用作最小单位而不是一位,以避免位移和加速function。

编辑:如果内存是优先级并且位大小在1到32之间,则仍然没有问题,因为大多数CPU一次支持多于1位的移位。

在x86下,如果使用32位寄存器,则可以一次最多32位。