In der Bildbearbeitung wird das auch oft eingesetzt. In einem [c]BufferedImage[/c] mit RGB-Farben werden die drei Farben in einem int abgelegt. Um an die einzelnen Teile zu kommen, muss man binär shiften und/oder "unden".
Gerade in solchen Fällen bin ich sogar der Meinung, dass Bitshifts etc. den Code nicht nur schneller, sondern vor allem auch lesbarer machen. Ein Bitshift sagt nun einmal "diese Zahl muss daunddort hoch", und ein UND sagt "mich interessiert nur derundder der Teil". Eine Multiplikation mit 65536 oder Modulo 256 würden weitaus weniger lesbar aussehen - denke ich.
Noch eine Bemerkung zur Haltung "Bitshifts sind nicht nötig, da kann der Compiler was optimieren": Er
kann nur vielleicht, aber eigentlich muss er gar nichts. Und für die Optimierung braucht er auch Zeit. Außerdem gibt es noch etwas zu beachten: Das Pipelining in der CPU kann nur dann gut funktionieren, wenn die entsprechenden Ressourcen auch frei sind. Nun ist es gut möglich, dass z.B. durch eine Multiplikation das Addierwerk besetzt wird, das der nächste Befehl hätte gebrauchen können. Weil es aber eben besetzt ist, muss der Befehl warten. (Out-of-order-execution ist auch nur begrenzt möglich, und die Optimierung dahingehend kostet auch Zeit.) Möglicherweise könnte ein Prozessor aber zugleich einen Bitshift ausführen. Und selbst wenn das nicht möglich ist: eine Multiplikation/Division kostet nun einmal viel Zeit, und wenn der Befehl nicht vereinfacht/wegoptimiert werden kann, haut das schon rein.
Als es um die Berechnung von Fraktalen ging, war bei mir ein Fall, bei dem ich einfach nur das Ergebnis einer Multiplikation gespeichert habe, um eine zweite (und nur diese zweite) Berechnung zu verhindern. Obwohl diese Multiplikation als fast nichts im Vergleich zu den anderen Berechnungen erschien, lohnte sich das Zwischenspeichern deutlich. Man sollte sich also nicht darauf verlassen, dass ein Compiler wirklich
alles optimiert, was man optimieren könnte.
Ark