Чтобы узнать, действительно ли это быстрее, так или иначе, вам нужно запустить профилировщик.
Существует два способа решения вашей проблемы (если вы не включили возможность обмена данными в растровом изображении).
Как @ 1201ProgramAlarm говорит:
// получаем указатель
uint16_t * p16 = (uint16_t *) растровое изображение;
uint16_t v (* p16);
v = (v >> 8) | (v << 8); // своп
v >> = 1;
* p16 = (v >> 8) | (v << 8); // переключаем обратно для сохранения в растровом изображении </p>
Это можно записать несколькими различными способами, и вы даже можете включить сдвиг в своп:
v = (v >> 9) | (v << 7);
- Вы не используете указатель p16
Поскольку вы можете выполнять своп и сдвиг одновременно, вы также можете напрямую использовать свой p8:
uint61_t v((bitmap[1] >> 9) | (bitmap[0] << 7));
bitmap[0] = v >> 8;
bitmap[1] = v; // C auto-and (i.e. (v & 0xFF) is not required)
Обратите внимание, что вы не можете оптимизировать намного больше, потому что когда вы изменяете растровое изображение, вы не можете перезагрузить данные после того, как они были изменены. Берегись этого.
Теперь эта сборка будет оптимизирована примерно так, хотя она может быть не самой быстрой (иногда возникают неожиданности, когда вы позволяете компилятору C / C ++ выполнять свою работу по оптимизации!)
mov ax, [ep] ; get current value (16 bits)
xchg al, ah
shr ax, 1 ; shift by one unsigned
xchg al, ah
mov [ep], ax ; save result
Для 32 и 64 битов в x86 есть инструкция swapb
(тоже в 64 битах).
Обратите внимание, что чтение и запись байтов по одному могут быть такими же быстрыми, как чтение 16 битов и xchg
-ing.