Я думаю, что проблема с первым подходом заключается в том, что вы читаете и пишете одинаковые 32/64 / x биты (в зависимости от архитектуры памяти / ширины шины) несколько раз.Это должно быть быстрее, если вы читаете и записываете биты, соответствующие ширине шины, один раз.
В следующем фрагменте getPixelsSizeOfLong
возвращает биты в соответствии с шириной шины (скажем, 4 байта) и уменьшаетпередача битов между кэшем и процессором.
// Forward declaration:
unsigned long getPixelsSizeOfLong(byteInImage unsigned int);
void setPixelsSizeOfLong(byteInImage unsigned int, newBitValue unsigned long);
unsinged long l;
for (a=0; a+=sizeof(l); a<nof_pixels) {
l = getPixelsSizeOfLong(a);
l |= 120;
setPixelsSizeOfLong(a, l);
}