Interpretation der TounsignedString -Methode
Ich habe gesehen, dass es in Ganzzahl eine solche Methode gibt, um INT in eine nicht signierte Typ -Zeichenfolge umzuwandeln, aber es gibt mehrere Punkte, die nicht sehr klar sind. Nachdem ich die Informationen abfragt habe, verstehe ich sie wie folgt:
/*** Konvertieren Sie die Ganzzahl in eine nicht signierte Nummer. */ private statische String tounsignedString (int i, int Shift) {char [] buf = new char [32]; int charpos = 32; int radix = 1 << Verschiebung; int mask = radix - 1; do {buf [-charpos] = digits [i & mask]; i >>>> = Verschiebung; } während (i! = 0); Neue Zeichenfolge zurückgeben (buf, charpos, (32 - charpos)); }Die Parameterverschiebung hier repräsentiert das binäre System. Wenn es Binär ist, beträgt die Verschiebung 2, Oktal 8 und die entsprechende Maske wird als 1 und 7 berechnet. Extrahieren Sie die entsprechenden Zeichen kontinuierlich im Ziffernarray durch Maske und i.
Auf diese Weise führe ich jedes Mal eine logische Rechtsverschiebungsoperation durch, und das höchste Bit wird mit Null ergänzt, so dass ich nach kontinuierlicher logischer Rechtsverschiebung 0 werde
Darüber hinaus besteht die Übernahme von DO-während, zu verhindern, dass das BUF-Array seinen Wert erhält, wenn ich selbst 0 ist.
Interpretation der ToString -Methode
// Dieses Array repräsentiert den zehnstelligen Teil der Nummer, und dieses Array wird unten verwendet. final static char [] DigitTens = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', 7 '7', '7', ' '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', 7 ',' 7 ',' '7', '7', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9',}; // Dieses Array repräsentiert den einstelligen Teil einer Nummer, und dieses Array wird unten verwendet. Wenn jeder Teil des Arrays kombiniert wird, können in allen Fällen zweistellige Zahlen in 100. endgültigen statischen Zeichen erhalten werden. '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', ',' 5 ',' 6 ',' 7 ',', ',', ',' 9 ',}; public static String toString (int i) {if (i == Integer.min_value) // hier 1 hinzufügen. Zuerst weiß ich nicht, was es bedeutet. Wenn ich später feststelle, dass eine negative Zahl gefunden wird, muss ich ein negatives Zeichen vor sich hinzufügen, sodass die Größe der Zeichenfolge hinzugefügt werden muss. Stringesize (-i) + 1: Stringsize (i); char [] buf = new char [Größe]; Getchars (ich, Größe, Buf); Neue Zeichenfolge zurückgeben (0, Größe, buf); } statische Leere getChars (int i, int index, char [] buf) {int q, r; int charpos = index; Zeichenzeichen = 0; if (i <0) {sign = '-'; i = -i; } // Führen Sie für Ganzzahlen über 65536 zunächst die folgende Verarbeitung durch, // in diesem Prozess in Einheiten von 100, dh der Rest wird in zwei Ziffern kontrolliert // Dies kartiert nur dem oben genannten zehnstelligen und einstelligen Array und schreibt zwei Ziffern im Buf-Array gleichzeitig. Dies ist zweifellos viel schneller als jede Ziffer zu finden (i> = 65536) {q = i / 100; // Wirklich: r = i - (q * 100); r = i - ((q << 6) + (q << 5) + (q << 2)); i = q; buf [-Charpos] = Digitone [R]; buf [-Charpos] = Digittens [R]; } // durch kleinere Zahlen in den schnellen Modus fallen // Assert (i <= 65536, i); // für Ganzzahlen, die weniger als oder gleich 65536 sind, kann der folgende Teil direkt durchgeführt werden // und dieser Ort wird durch 10 geteilt, aber die Implementierung ist nicht direkt geteilt // Stattdessen finden Sie einen 52429/2^19 -Wert von 52429/2^19. Es ist ungefähr 0,1000. Nummer, // Vielleicht ist es ungenau und multiplizieren Sie dann den Divisor mit 10, um die Anzahl von mehr als 10 Ziffern zu erhalten // Teil. Mit der Zahl mit mehr als zehn Ziffern in diesem Teil erhalten Sie die Anzahl der einzelnen Ziffern für (;;) {q = (i * 52429) >>> (16+3); r = i - ((q << 3) + (q << 1)); // r = i- (q*10) ... buf [-Charpos] = digits [r]; i = q; if (i == 0) brechen; } if (sign! = 0) {buf [-Charpos] = Sign; }} endgültig statische int [] Sizetable = {9, 99, 999, 9999, 99999, 999999, 999999, 999999, 9999999, 9999999, Ganzzahl.MAX_VALUE}; // Dies sollte hier optimiert werden, und die Teile der Ganzzahl -Daten werden durch Sizetable gespeichert //, von eins bis 10 Bit: 2147483647, // Diese Verarbeitungsmethode ist geschickt statisches Int -Strieren (int x) {für (int i = 0; i ++) if (x <= Sizetable [i]) zurück I+1; }Interpretation der Higestonbit -Methode
public static int hegstonebit (int i) {// hd, Abbildung 3-1 i | = (i >> 1); i | = (i >> 2); i | = (i >> 4); i | = (i >> 8); i | = (i >> 16); return i - (i >>> 1); }Diese Methode ist sehr interessant. Ich habe es selbst berechnet, bevor ich seine Essenz verstand. Die Funktion dieser Methode besteht darin, den Wert der Ganzzahl zu finden, die durch das größte Teil einer Ganzzahl dargestellt wird. Diese Funktion wird hier durch Verschiebung realisiert. Lassen Sie uns ein einfaches Beispiel geben. Für 128 beträgt Binary 1000 0000. Nehmen wir ihn als Beispiel:
Verschieben Sie 1 Ziffer
1000 0000
0100 0000
| -------------
2 Ziffern bewegen
1100 0000
0011 0000
| ------------
4 Bit bewegen
1111 0000
0000 1111
| ------------
8 Bit bewegen
1111 1111
0000 0000
| ------------
Mobile 16 Bit
1111 1111
0000 0000
| ------------
1111 1111
Das Endergebnis ist, wie Sie sehen können. Alle folgenden Bits sind mit 1 gefüllt, und alle folgenden Bits werden abgezogen, um die Ganzzahl durch das höchste Stück darzustellen.
BitCount -Methodenanalyse
public static int bitcount (int i) {// hd, Abbildung 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; } Diese Methode war für lange Zeit wirklich nutzlos, und später fand ich eine grobe Idee heraus:
In der ersten Zeile soll die Implementierung die binären Bits des ganzzahligen Typs in zwei und zwei gruppieren und dann die Anzahl 1 unter den beiden Bits zählen. Ich weiß nicht, wie diese Formel stammt, aber es ist in der Tat der Fall.
Die zweite Zeile implementiert die Gruppierung von vier und vier binären Bits der Ganzzahl und berechnet dann die Verschiebungsinstrument innerhalb des Segments, das 1001-> 10 + 01 = 11 ist. Sie entspricht drei 1 1s. Die dritte Linie besteht darin, acht binäre Bits der Ganzzahl zu gruppieren und dann Verschiebungen hinzuzufügen, die der obigen Methode ähneln. Dies wird natürlich durch bestimmte Verschiebungen und Operationen erreicht.
Als nächstes stehen sechzehn Gruppen und zweiunddreißig Gruppen und fusionieren schließlich die Statistiken in die Statistiken, die durch die letzten Ziffern dargestellt werden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.