c++ - 将 1 到 32 位数字附加到 char 缓冲区

标签 c++ c bit-manipulation

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

因此,我需要一个函数:

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

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

我当然可以将位一位一位地移到缓冲区中,但速度至关重要,因此看起来应该可以一次移动更大的 block 。有没有标准的方法来做到这一点?似乎应该有一个标准方法,但一些谷歌搜索和 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 位,否则您需要添加一个步骤来切掉额外的(不需要的)位。它还假设在开始添加位之前缓冲区已初始化为零。

关于c++ - 将 1 到 32 位数字附加到 char 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346637/

相关文章:

位掩码的 C++ 面向对象等价物

c++ - OpenCV-OpenGL 互操作性

c - 如果用户输入大于 10 的数字,为什么程序会循环相同的输出?

C 动态结构体的动态数组

math - 为什么我们需要在做 2 的补码时加 1

c - 高效地对 int 数组进行位移?

c++ - 还需要字符串头文件吗?

c++ - 从VS2008升级后,在VS2012中建工程报错

c - 从 C 内存错误中的字符串中删除空格

java - 按位运算符代码