我有一个char*
缓冲区,我希望将各种位大小的整数(1
和32
之间)附加到。
因此,我需要一个功能:
void addBits(char *buffer, int bits_appended_so_far, int object, int object_bit_size);
可以将13
位的对象移动到缓冲区的470
位。
我当然可以逐位将位移到缓冲区,但速度至关重要,所以看起来应该可以一次移动更大的块。有没有标准的方法来做到这一点?似乎应该有一个标准的方法,但一些谷歌搜索和SO搜索没有给我我想要的。
答案 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)
答案 2 :(得分:0)
最简单的解决方案似乎是使用基本的memcpy并在位置不是字节对齐时适当地移位
答案 3 :(得分:0)
标准字大小为1,2,4,8和16字节取决于CPU,因此您一次只能移位8,16,32,64或128位。没有标准的方法!
如果您不想使用内存空间而不是我的建议,那就是将一个字节用作最小单位而不是一位,以避免位移和加速功能。
编辑: 如果内存是优先级并且位大小在1到32之间,则仍然没有问题,因为大多数CPU一次支持多于1位的移位。
在x86下,如果使用32位寄存器,则可以一次最多32位。