interessanter Gesichtspunkt...
s ist ja immerhin volatile, also darf der Compiler diese Operation nicht wegoptimieren (was gpp sonst automatisch macht).
Dadurch wird das Shiften also keine Null- oder Leernummer.


Da müssen jetzt mal die hier einschlägig bekannten C/C++ Spezialisten etwas sagen...

- - - Aktualisiert - - -

habe jetzt mal den Mess-Code per Zusatz-Variable auf einen gemeinsamen Nenner gestellt:

Code:
long test_Int_multdiv2() {
  uint32_t  x,y;
  volatile uint32_t  s,t;

  for(y=0;y<10000;y++) {
    s=11;
    for(x=1;x<=16;x++) { t=s*2;}
    for(x=16; x>0;x--) { t=s/2;}
    s=7;
    for(x=1;x<=8;x++) { t=s*8;}
    for(x=8; x>0;x--) { t=s/8;}
  }
  return s;
}


long test_Int_shl_shr() {
  uint32_t  x,y;
  volatile uint32_t  s,t;

  for(y=0;y<10000;y++) {
    s=11;
    for(x=1;x<=16;x++) { t=(s<<1);}
    for(x=16; x>0;x--) { t=(s>>1);}
    s=7;
    for(x=1;x<=8;x++) { t=(s<<3);}
    for(x=8; x>0;x--) { t=(s>>3);}
  }
  return s;
}
auch hier: beide identisch!

ARM Cortex M0
Code:
start test
  0        93  Int_multdiv2
  1        93  Int_shl_shr
AVR (Mega2560)
Code:
start test
  0      1220  Int_multdiv2
  1      1220  Int_shl_shr

Fazit:
wenn einfach nur eine Variable erhöht werden soll, ist shiften schneller als Multipl./Division.

Wenn aber Werte zugewiesen und damit weiter gerechnet werden soll, sind beide gleich schnell, und das war ja hier die vorrangige Fragestellung