Der Unterschied besteht darin, dass arithmetische Operationen klar definierte Ergebnisse haben (es sei denn, sie führen zu einem vorzeichenbehafteten Überlauf). Verschiebeoperationen haben in vielen Fällen keine definierten Ergebnisse. Sie sind für vorzeichenlose Typen sowohl in C als auch in C++ klar definiert, aber bei vorzeichenbehafteten Typen wird es schnell kompliziert.
In der Sprache C++ ist die arithmetische Bedeutung von left-shift <<
für vorzeichenbehaftete Typen ist nicht definiert. Es werden lediglich Bits verschoben und mit Nullen auf der rechten Seite aufgefüllt. Was dies im arithmetischen Sinne bedeutet, hängt von der von der Plattform verwendeten vorzeichenbehafteten Darstellung ab. Praktisch das Gleiche gilt für die Rechtsverschiebung >>
Betreiber. Die Rechtsverschiebung negativer Werte führt zu implementierungsabhängigen Ergebnissen.
In der Sprache C sind die Dinge etwas anders definiert. Eine Linksverschiebung negativer Werte ist unmöglich: Sie führt zu undefiniertem Verhalten. Die Rechtsverschiebung negativer Werte führt zu implementierungsdefinierten Ergebnissen.
In den meisten praktischen Implementierungen führt jede einzelne Rechtsverschiebung eine Division durch 2 mit Abrundung gegen negativ unendlich aus. Dies unterscheidet sich übrigens deutlich von der arithmetischen Division /
durch 2, da in der Regel (und in C99 immer) gegen 0 gerundet wird.
Was die Verwendung von Bit-Shifting angeht... Bit-Shifting ist für Operationen, die mit Bits arbeiten. Bit-Shifting-Operatoren werden nur sehr selten als Ersatz für arithmetische Operatoren verwendet (z. B. sollten Sie niemals Shifts verwenden, um eine Multiplikation/Division mit einer Konstanten durchzuführen).