Gegeben seien zwei streng positive ganze Zahlen x und y in der Basis 2 ausgedrückt, gibt es eine schnelle Möglichkeit, zu überprüfen, ob x = 2^ny wo n ist eine ganze Zahl? (Das ist das gleiche wie die Überprüfung, ob x eine verschobene Version von ist y, aber ich bin nicht sicher, ob dies tatsächlich einfacher ist.)Schnell Art und Weise zu überprüfen, ob eine ganze Zahl 2^n-mal eine andere ganze Zahl ist
Eine Lösung besteht darin zu prüfen, ob x% y = 0 und dass x/y ist eine Zweierpotenz (die sehr effizient durchgeführt werden kann [1]), aber dies erfordert einen Modulo und eine Division, zwei teure Operationen, sogar auf modernen Architekturen.
[1] x ist eine Zweierpotenz, wenn und nur wenn (x & (x - 1)) = 0
Ihre Normalisierungsidee ist interessant! Ich bin auf x64, und ja, ich habe Zugriff auf '_BitscanForward'. –
@ FrançoisBeaune ok, 'bsf' ist anders als' tzcnt' für ein Argument von 0, was in diesem Fall keine Rolle spielt, weil die um einen beliebigen Betrag verschobene Null immer noch Null ist – harold