2012-03-28 10 views
4

Ich habe die folgende einfache Gleichung in meinem C# -Programm, um eine Zahl zu einem resultierenden Wert zu umwandeln:Invert bitweise Shift-Operator/Zweierpotenz

sectorSize = 1 << sectorShift; 

Gibt es irgendeine Art von Inversbetrieb, den mir erlaubt zu gehen auch andersherum?

Ich weiß, dass Sie eine Schleife implementieren können, aber das ist ein bisschen ein Overkill. Ich musste das vorher noch nie machen, also habe ich keine Ahnung und ich kann online nichts darüber finden. Die Gleichung, die ich brauche, muss nur gültige Ergebnisse liefern, wenn Sektorgröße eine Zweierpotenz ist; Der Rest der Domain kann für alles, was mich interessiert, zur Hölle gehen.

+1

Die Umkehrung von << is >>? Oder meintest du etwas anderes? –

+0

BitShift würde Ihnen sowieso nur Zwei-Potenz-Operationen geben. '' '' ist die linke Verschiebung, '>>' ist die rechte Verschiebung. –

+0

@MattBurland nicht technisch korrekt. Inverse bedeutet "die Funktion, die eine andere rückgängig macht". Wegen Überfüllung gilt das nicht immer in C#: '(Int32.MaxValue << 1) >> 1! = Int32.MaxValue' –

Antwort

9

Logarithmen. Da Sie dies jedoch nicht tun möchten, verwenden Sie eine Schleife und/oder Nachschlagetabelle.

+6

Etwas konkreter: x = 1 << n bedeutet x = 2^n.Um n aus x zu erhalten, muss n = Log (x, 2) berechnet werden. –

+0

Alles klar, danke für die Antwort. – aboveyou00

+0

Danke, ich habe gerade etwas gelernt! – Aybe

11

Hier sind fünf Möglichkeiten, das in C zu tun. Das Übersetzen von ihnen, um C# zu korrigieren, bleibt als Übung übrig. Seien Sie sehr vorsichtig.

http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious

Ehrlich gesagt, würde ich persönlich immer mit der Schleife gehen. Es ist mir nicht klar, warum Sie glauben, dass einfacher und offensichtlich korrekter Code "Overkill" ist.

+0

Bei Schleifen muss man auf die Abbruchbedingung achten. Die Abwärtsschleife, die Sie verbunden haben, leidet nicht an solchen Problemen, aber eine Schleife, die aufwärts zählt und '1 << i' mit der Eingabe vergleicht, kann für große Eingaben brechen. – CodesInChaos

+0

@CodeInChaos: Ja. Deshalb habe ich gesagt * sei sehr vorsichtig *. Es ist sehr leicht, ein bisschen falsch zu drehen. –