実際、ATMega には、ほとんどの (すべてではないにしても) 他の 8 ビット MCU のようなバレル シフターがありません。したがって、より強力な CPU のような任意の値ではなく、毎回 1だけシフトできます。その結果、4 でシフトすることは、理論的には3 でシフトするより遅くなります。
ただし、ATMegaにはスワップニブル命令があるため、実際x >> 4
にはATMegaよりも高速ですx >> 3
であると仮定するx
と、uint8_t
3つの右シフトx >>= 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;
したがって、char で 3 シフトするよりもさらに高速です。
結論として、シフト時間はシフト距離によって異なりますが、より長い値や 2 のべき乗でない値の場合、必ずしも遅くなるとは限りません。一般に、8 ビット char 内でシフトするには、最大で 3 つの命令が必要です。
コンパイラ エクスプローラのデモをいくつか示します。
4 の右シフトは、上記の aswap
などによって実現されます。and
swap r24
andi r24,lo8(15)
3 の右シフトは、3 つの命令で実行する必要があります。
lsr r24
lsr r24
lsr r24
左シフトも同様に最適化
x<<1 と x<<10 のどちらが速いですか?も参照してください。