Сдвиг байтового буфера - PullRequest
1 голос
/ 30 января 2012

У меня есть буфер двоичных данных:

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

Я хочу обработать кусок данных за пределами этого буфера (например, 50 точек данных)

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

Как только данные обработаны, они мне больше не нужны, поэтому я хочу отбросить их и поместить буфер указателя * в 51-ю точку данных.Тем не менее, мне все еще нужен буфер, чтобы указать на буфер, который имеет 1024 места в нем.Чтобы сделать это, я подумал, что сделаю это немного, потому что это достигнет моей цели и, насколько я знаю, быстро (я в теме с высоким приоритетом).Однако мне неясно, как битовое смещение работает с байтовыми массивами.

Во-первых, если я хочу сместить массив так, чтобы * buffer указывал на значение, ранее содержавшееся в buffer [50], это то, чтоСдвиг влево или вправо в C (Цель C)?

Во-вторых, если я смещу буфер, он сместит все 1024 точки данных или сместит только одну точку SInt16 в буфере [0]?

Идея заключается в том, что процессор будет считывать фрагменты с начала буфера и затем сигнализировать считывателю файлов в другом потоке, чтобы добавить новые данные в конец буфера.Если обработано 50 точек данных, то эти 50 точек отбрасываются, и программа чтения файлов добавляет 50 новых точек данных в конец байтового буфера.

Ответы [ 4 ]

2 голосов
/ 30 января 2012

Это никак не связано с битшифтом.Вам нужно смещение целого размера (в байтах).Вы можете использовать memmove или эквивалентный.

OTOH у вас определенно есть недостаток в вашем дизайне.Перенос ваших данных занимает время, пропорциональное его оставшейся части.Итак, если вы обработали только 50 первых элементов, а затем переместили 1024-50 оставшихся - это неэффективно.

Вам лучше переделать свой код, чтобы вы перемещали только указатель, все же у вас есть (в другой переменной)указатель на начало выделения

1 голос
/ 30 января 2012

Сдвиг битов не имеет ничего общего с массивами / буферами.

Вы могли бы перемещать данные в буфере с помощью копирования, но это невероятно неэффективно.

Вы действительно должны подумать об использовании / реализации циклического буфера для этого.

1 голос
/ 30 января 2012

Это подозрительно похоже на стандартный вариант использования для кольцевого буфера.

Если это так, вы сохраняете место для чтения и записи вместе с основным хранилищем: вы просто обновляете место записи, чтобы указатьэлементы, которые вы использовали, могут быть перезаписаны.

Обратите внимание, что это только круговая форма, потому что в конце вы оборачиваетесь, базовое хранилище не нужно менять.

Посмотрите на Википедия для деталей.


Обратите внимание, что здесь вы будете копировать (например, memcpy или memmove), сдвиг битов обычно выполняется внутри машинных слов, а неих.Как говорит Вальдо, манипулирование указателем в любом случае происходит намного быстрее.

0 голосов
/ 30 января 2012

Нет оператора для смещения всего массива в одном выражении. Даже если вы управляете чем-то подобным (например, crate union, который содержит SInt64 и SInt16[4]), ваша программа не будет переносимой (поскольку на разных машинах порядок байтов различен).

Я предлагаю вам иметь int begin,end; для сохранения индексов данных и использовать оператор %.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...