如何解决将1到32位数字追加到char缓冲区
我有一个“ 0”缓冲区,我想在上面附加各种位大小(在“ 1”和“ 2”之间)的整数。 因此,我需要一个函数:void addBits(char *buffer,int bits_appended_so_far,int object,int object_bit_size);
可以将“ 4”位的对象移动到缓冲区的“第5”位位置。
我当然可以将这些位一一地移到缓冲区中,但是速度至关重要,因此似乎应该可以一次移动更大的块。是否有标准方法可以做到这一点?似乎应该有一个标准方法,但是使用谷歌搜索和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
仅设置了最低有效的set8ѭ位,否则,您需要添加一个步骤以截去多余的(不需要的)位。它还假定在开始添加位之前将缓冲区初始化为零。
,
使用shift在32位int中正确对齐位。
查找字节在缓冲区中的位置。
如果需要保留缓冲区的内容,请创建一个指向相关字节的int指针,然后按位|将32位int插入该位置。
如果不需要保留内容,则只需memcpy(buffer location,32-bit int);
, 最简单的解决方案似乎是使用基本的memcpy并在位置未按字节对齐的情况下适当移位
, 标准字长取决于CPU的1,2,4,8和16字节,因此您一次只能移位8,16,32,64或128位。没有标准方法!
如果您不打算比我的建议保留更多的存储空间,则请以最小单位使用一个字节而不是一个位,以避免移位和加速功能。
编辑:
如果内存是优先级,并且位大小在1到32之间,则仍然没有问题,因为大多数CPU一次支持超过1位的移位。
在x86下,如果使用32位寄存器,则一次最多可以转换32位。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。