2009-06-17 1 views
0

Ich weiß, dass Sie eine Power-of-two-Nummer in der Hälfte wie so aufteilen:Split ein Nicht-Strom-of-two int basierend

halfintR = some32bitint & 0xFFFF 
halfintL = some32bitint >> 16 

können Sie die gleiche Sache für eine ganze Zahl zu tun, das ist begrenzt durch eine Nicht-Macht von zwei Räumen?

(sagen, dass Sie Ihren Bereich auf die Menge der ganzen Zahlen beschränkt sein wollen, die in 4-stellige Basis 52 Raum ohne Vorzeichen passt)

Antwort

1

Sie konnten die folgende

rightDigits = number % 2704 // 52 squared 
leftDigits = number/2704 
+0

warum quadriert? Wenn es ein 6-stelliges Leerzeichen wäre, würde ich 52 ** 3 verwenden? –

+0

genau, verwenden Sie 52 ** 2, um die letzten 2 Ziffern –

+0

zu bekommen, wenn es 5 Ziffern wäre, würde ich (52 * 52 * 26) verwenden? Um diese Operation umzukehren, würde ich einfach (leftDigits * 52 ** 2) + rightDigits verwenden, oder? –

1

Nun, natürlich. & 0xffff ist das gleiche wie % 0x10000 und >> 16 ist das gleiche wie / 0x10000. Es ist nur so, dass Division durch eine Zweierpotenz effizienter ist, wenn Bitoperationen wie Verschieben und Maskieren ausgeführt werden. Division arbeitet mit einer beliebigen Zahl (innerhalb der Reichweite der Darstellung).

+1

Nun, ich würde argumentieren, dass die Bit-Verschiebung Sache für Programmierer einfacher als Modul oder Division an diesem Punkt zu erfassen ist. Schreiben Sie auf jeden Fall, was Sie meinen, und lassen Sie den Compiler den Rest erledigen. Vorzeitige Optimierung und Zeug :). Wenn Sie tatsächlich durch zwei teilen wollen, schreiben Sie es auf jeden Fall als Division durch zwei und nicht als Bitshift. – Joey

+1

Ganz zu schweigen davon, dass ein Compiler wahrscheinlich den effizientesten Weg findet, um Modulos und Divisionen mit konstanten Zweierpotenzen auszuführen. In fast allen Fällen wissen sie mehr über das Erstellen von gutem Code als Sie. –

1

verwenden Sobald Sie erkennen, dass die & und >> jeweils dafür modulo und division Berechnung verwendet werden, können Sie schreiben, was Sie wollen als:

lower = some4DigitsNumberBase52 % (52 * 52) 
upper = some4DigitaNumberBase52/(52 * 52) 

Diese ist die Grundlage für die Basisberechnung. Sie können die Lösung auch aus dem Algorithmus ableiten, der eine Zahl in einer bestimmten Basis anzeigt: Wie kommen Sie zu den zwei ganz rechts stehenden Ziffern und den zwei ganz links stehenden Ziffern.