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

时间:2011-06-14 16:12:23

标签: c++ c bit-manipulation

我有一个char*缓冲区,我希望将各种位大小的整数(132之间)附加到。

因此,我需要一个功能:

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

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

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

4 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

void addBits(char *buffer, int bits_appended_so_far, int object, int object_bit_size) {
  int* int_buffer = reinterpret_cast<int*>(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位,否则您需要添加一个步骤来关闭额外(不需要的)位。它还假设在开始添加位之前将缓冲区初始化为零。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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