Действительно, ATMega не имеет переключателя ствола, как большинство других 8-битных MCU.Поэтому он может сдвигаться только на 1 каждый раз вместо любых произвольных значений, таких как более мощные процессоры.В результате сдвиг на 4 теоретически медленнее медленнее, чем сдвиг на 3
Однако ATMega имеет команду перестановки nibble так что фактически x >> 4
быстрее, чем x >> 3
Если предположить, что x
является uint8_t
, тогда x >>= 3
реализуется 3 правыми сдвигами
x >>= 1;
x >>= 1;
x >>= 1;
, тогда как x >>= 4
требуется только обмен и немного очистки
swap(x); // swap the top and bottom nibbles AB <-> BA
x &= 0x0f;
или
x &= 0xf0;
swap(x);
Для большего кросс-регистр сдвигов также есть различные способы его оптимизации
с переменной uint16_t
y
, состоящей из нижней части y0
и верхней части y1
, тогда y >> 8
просто
y0 = y1;
y1 = 0;
Аналогично y >> 9
можно оптимизировать до
y0 = y1 >> 1;
y1 = 0;
В заключение, время сдвига зависит от расстояния сдвига , но оно составляет не обязательно медленнее для более длинных значений или значений не степени 2 .Как правило, для сдвига в пределах 8-битного символа потребуется не более 3 инструкций.
Вот несколько демонстраций из проводника компилятора
Справасдвиг на 4 достигается с помощью swap
и and
, как указано выше
swap r24
andi r24,lo8(15)
Сдвиг вправо на 3 должен быть выполнен с 3 инструкциями
lsr r24
lsr r24
lsr r24
Сдвиги влево также оптимизируются аналогичным образом
См. Также Что быстрее: x << 1 или x << 10? </a>