c: указатели - как увеличить каждый 2-й байт на X - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть указатель, который содержит 100 байтов данных.я хотел бы добавить 5 к каждому 2-му байту.

пример:

1 2 3 4 5 6

станет:

1 7 3 9 5 11

Теперь я знаю, что могу сделать цикл for,Есть ли более быстрый способ?что-то вроде memset, которое будет увеличивать значение каждого второго байта?

спасибо

Ответы [ 4 ]

2 голосов
/ 22 декабря 2010

Лучшим способом будет петля.memset () эффективен для установки непрерывного блока памяти.Здесь вам не очень поможет.

2 голосов
/ 22 декабря 2010

В каком формате у вас есть ваши байты? Как составные буквы? Или байты являются частью, например, a uint32?

В общем, цикл - это лучший способ сделать это - даже если вы сможете применить шаблонную маску с memset, вам все равно нужно будет создать ее, и это займет столько же циклов ЦП.

Если бы у вас было 4 байта на элемент (например, uint32), вы могли бы сократить циклы процессора пополам, создав предопределенную маску для добавления. Но внимание: такое решение не будет проверять наличие переполнений (псевдокод):

uint32* ptr = new uint32[16]; // creates 64 bytes of data
(...) fill data
for (int k=0; k < 16; ++k)
{
   // Hardcored Add-Mask for Little Endian systems
   ptr[k] += 0x05000500; // dereference and add mask to content
}

Изменить: Обратите внимание, что это предполагает немного порядковый номер системы и псевдокод C ++.

0 голосов
/ 22 декабря 2010

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

array[ 1 ] += 5;
array[ 3 ] += 5;
array[ 5 ] += 5;
...

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

0 голосов
/ 22 декабря 2010

Если memset поддерживает увеличение значения каждого n-го байта, как, по вашему мнению, это будет достигнуто?

...