У меня есть тяжелый по производительности код, который выполняет битовые манипуляции. Это может быть сведено к следующей четко определенной проблеме:
Для 13-битной битовой карты построить 26-битную битовую карту, которая содержит исходные биты, разнесенные на четные позиции .
Для иллюстрации:
0000000000000000000abcdefghijklm (input, 32 bits)
0000000a0b0c0d0e0f0g0h0i0j0k0l0m (output, 32 bits)
В настоящее время у меня это реализовано на C следующим образом:
if (input & (1 << 12))
output |= 1 << 24;
if (input & (1 << 11))
output |= 1 << 22;
if (input & (1 << 10))
output |= 1 << 20;
...
Мой компилятор (MS Visual Studio) превратил это в следующее:
test eax,1000h
jne 0064F5EC
or edx,1000000h
... (repeated 13 times with minor differences in constants)
Интересно, смогу ли я сделать это быстрее. Я хотел бы, чтобы мой код был написан на C, но возможно переключение на язык ассемблера.