Ich grübel nun schon ne ganze Weile wie ich es umsetzen würde. In C++ vermutlich mit Operator Überladung, aber das wird in Java leider nichts.
Die Idee nach jedem Schritt eine Division zu starten erscheint mir etwas oversized, auch wenn es natürlich nur eine kurze Operation ist. Einen Integer auf 16bit begrenzen geht rechts simpel mit eine "und" Verknüpfung. ein "wert & 0xFFF" verwirft in jedem Fall alles, was > 16bit ist. Aber für das Shiften von Signed auf Unsigned habe ich noch keine Idee. Jedes Mal den Wert neu interpretieren wäre wieder ein zu großer extra Aufwand.
Edit:
scheinbar hatte ich gerade einen Denkfehler. Das müsste sogar direkt mit der Maske funktionieren. Eine 32bit Zahl (egal ob signed oder unsigned) mit 16bit (0xFFFF) "&" verknüpft ist immer eine positive 16bit Zahl.
Damit funktionieren auch Bereichüberläufe problemlos, da bei Überschreitung von int16_max wieder 0 entsteht.