Bitshifting一个字节缓冲区

时间:2012-01-30 17:32:39

标签: objective-c c

我有二进制数据缓冲区:

SInt16 *buffer = (SInt16 *)calloc(1024,sizeof(SInt16));

我想在此缓冲区前面处理一大块数据(例如50个数据点)

for(int i = 0; i < 50 ; ++i){
   process_data(buffer[i])
}

一旦处理完数据,我就不再需要它了,所以我想丢弃它并将指针*缓冲区放在第51个数据点。但是,我仍然需要缓冲区指向一个有1024个位置的缓冲区。为了做到这一点,我想我会做一点转移,因为它完成了我的目标,据我所知,很快(我在一个高优先级的线程)。但是我不清楚位移对字节数组的影响。

首先,如果我想移动数组,使*缓冲区指向以前包含在缓冲区[50]中的值,那么C(目标C)中的左移位还是右移?

其次,如果移位缓冲区,它会移动所有1024个数据点,还是只移位缓冲区[0]上的一个SInt16数据点?

这里的想法是处理器将从缓冲区的开头读取块,然后在另一个线程上发信号通知文件读取器将新数据附加到缓冲区的末尾。如果处理了50个数据点,则丢弃这50个点,文件读取器将50个新的数据点附加到字节缓冲区的末尾。

4 个答案:

答案 0 :(得分:2)

这与bitshift无关。您需要移动整数大小(以字节为单位)。您可以使用memmove或同等的。

OTOH你的设计肯定有缺陷。移动数据需要时间与其余部分成比例。因此,如果您只处理了50个第一个元素,然后移动了1024个剩余的元素 - 它就无效了。

你最好重新设计你的代码,以便只移动指针,你仍然(在另一个变量中)指向分配开头的指针

答案 1 :(得分:1)

这听起来像是循环缓冲区的标准用例。

如果是这样,您将保留一个读写位置以及主存储:您只需更新写入位置,以指示您消耗的元素可以被覆盖。

请注意,它只是循环,因为你在最后包裹,底层存储不必改变。

请查看wikipedia了解详情。


请注意,你要复制(例如,memcpy或memmove),bithifting通常在里面机器字中完成,而不是在它们之间。正如valdo所说,无论如何,指针操作要快得多。

答案 2 :(得分:1)

位移与数组/缓冲区无关。

可以通过复制在缓冲区中移动数据,但这非常低效。

你真的应该考虑为此使用/实现circular buffer

答案 3 :(得分:0)

没有运算符可以在一个语句中移动整个数组。即使你管理这样的东西(例如,包含SInt64SInt16[4]的crate union),你的程序也不可移植(因为不同机器上的字节序不同)。

我建议您int begin,end;保存数据的索引,并使用%运算符。