将1到32位的数字附加到字符缓冲区

Append 1 to 32 bit numbers to a char buffer

本文关键字:字符 缓冲区 32位 数字      更新时间:2023-10-16

我有一个char*缓冲区,我想将各种比特大小的整数(在132之间)附加到.

因此,我需要一个函数:

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

其可以将例如13比特的对象移动到缓冲器的第470比特位置。

当然,我可以一个接一个地将比特转移到缓冲区,但速度至关重要,所以似乎可以一次移动更大的块。有标准的方法吗?似乎应该有一个标准的方法,但一些谷歌搜索和SO搜索并没有给我想要的。

这样的东西怎么样:

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位,否则您需要添加一个步骤来切掉多余的(不需要的)位。它还假设在开始添加位之前,缓冲区已初始化为零。

  • 使用shift将32位int中的位正确对齐
  • 查找缓冲区中字节的位置
  • 如果需要保留缓冲区的内容,请创建一个指向相关字节的int指针,然后逐位|将32位int放入该位置
  • 如果不需要保留内容,只需memcpy(缓冲区位置,32位int)

最简单的解决方案似乎是使用基本的memcpy,如果位置不是字节对齐的

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

如果你习惯于腾出内存空间,那么我的建议是使用一个字节作为最小单元,而不是一位,以避免移位和加快功能。

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

在x86下,如果您使用32位寄存器,您可以一次屏蔽多达32位。