Split ein nicht-Power-of-two basiert int
-
06-07-2019 - |
Frage
Ich weiß, dass Sie eine Power-of-two-Nummer in der Hälfte wie so aufteilen:
halfintR = some32bitint & 0xFFFF
halfintL = some32bitint >> 16
Sie können das gleiche tun für eine ganze Zahl, die von einer Nicht-Zweierpotenz Raum begrenzt ist?
(sagen, dass Sie Ihren Bereich auf die Menge der ganzen Zahlen beschränkt sein, die in 4-stellige Basis 52 Platz unsigned passen)
Lösung
Sie können die folgenden Befehle verwenden
rightDigits = number % 2704 // 52 squared
leftDigits = number / 2704
Andere Tipps
Nun, natürlich. & 0xffff
ist die gleiche wie % 0x10000
und >> 16
die gleiche wie / 0x10000
ist. Es ist nur, dass die Division durch eine Potenz von zwei ist effizienter, wenn sie mit Bit-Operationen wie Verschieben und Maskierung durchgeführt. Abteilung arbeitet mit einer beliebigen Anzahl (im Bereich der Repräsentation).
Sobald Sie erkennen, dass die &
und >>
verwendet werden, für die jeweils modulo
und division
Berechnung zu tun, können Sie schreiben, was Sie wollen, wie:
lower = some4DigitsNumberBase52 % (52 * 52)
upper = some4DigitaNumberBase52 / (52 * 52)
Dies ist die Grundlage für die Basisberechnung zu tun. Sie können auch die Lösung aus dem Algorithmus ableiten, das eine Zahl in einer bestimmten Base zeigt:., Wie Sie mit den beiden rechten Ziffern und die zwei am weitesten links stehenden Ziffern kommen up