将1到32位的数字附加到字符缓冲区
Append 1 to 32 bit numbers to a char buffer
我有一个char*
缓冲区,我想将各种比特大小的整数(在1
和32
之间)附加到.
因此,我需要一个函数:
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位。
相关文章:
- C++字符*缓冲区的大小
- 将字符缓冲区强制转换为函数指针
- 来自无符号字符缓冲区的虚拟输出
- 如何在C++中将无符号字符缓冲区转换为双精度?
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 将字符缓冲区转换为字符串
- 读取文件时字符缓冲区溢出
- 来自字符缓冲区的恐惧
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"
- C/C++ 从字符缓冲区读取以填充结构
- 具有输入无符号字符缓冲区C++的设备 IoControl
- 如何从字符 * 缓冲区中的位置 y 读取 x 个字符
- 从字符 * 缓冲区到 wchar_t * 缓冲区的内存
- 如何将字符 * 缓冲区转换为无符号的短 int * bufferSh
- 将windows BITMAP转换为PIX(无符号字符缓冲区)
- RAII字符缓冲区
- MFC-传递带有PostMessage From DLL的字符缓冲区
- 如何使用Gstreamer播放原始字符*缓冲区
- 在 Win32 中解析巨大的字符* 缓冲区
- 分配字符缓冲区以保存浮点的文本表示形式