2016-04-16 3 views
0

Beim Konvertieren einer String in BigInteger berechnet Java intern die Anzahl der Bits und dann die Anzahl der Wörter (jedes Wort ist eine Gruppe von 9 ganzen Zahlen, denke ich) in einem BigInteger gesehen here von der Linie 325 zur Linie 327. numWords verwendet wird dann ein Array zu erstellen, empfangen kann, dass BigInteger.Berechnen der Anzahl der Bits und der Anzahl der Wörter BigInteger

ich nicht die Logik verstehen verwendet für numBits in Zeile 325 zu berechnen und dann die Logik für numWords in Zeile 326.

Logisch denke ich, dass für die Zeichenfolge "123456 789 ", numWords sollte 1 sein und für" 12345678912 ", sollte 2 sein, aber das ist nicht immer der Fall. Zum Beispiel für "12345678912345678912", numWords sollte 3 sein, aber es kommt heraus, um 2 zu sein.

Kann jemand bitte die in Zeile 325 und 326 verwendete Logik erklären?

+0

Im traditionellen 16-Bit-Modus wird ein Wort als 16 Bit oder 2 8 Byte oder als Ganzzahl ausgedrückt. Im 32-Bit-Modus hat eine ganze Zahl mit 32 Bit oder 4 Byte ein Wort ersetzt. A die Linie auf 326 sieht aus wie es mit Zweierkomplement zu tun hat. – t0mm13b

Antwort

1

Um Dezimalzahl von numDigits als binäre Zahl darstellen, bedarf es

numDigits * Math.log(10)/Math.log(2) 

Bits.

int numBits = (int)(((numDigits * bitsPerDigit[radix]) >>> 10) + 1); 

Bei der Berechnung oben bitsPerDigit[10] ist 3402.

Math.log(10)/Math.log(2) * Math.pow(2, 10) = 3401.6543691646593 
+0

Ich kenne die Berechnungen. Ich wollte verstehen, was die Logik bei der Berechnung der Anzahl der Bits ist ('numBits'). – Diffy

+0

In Java sind BigIntegers als Array von 32-Bit-Ganzzahlen angeordnet. Ganzzahlige Ganzzahlen sind nicht erlaubt, daher ist die Darstellung immer normalisiert (d. H. So kompakt wie möglich). Dies macht es einfach, die Anzahl der Bits im Pseudocode zu berechnen: 32 * (array_length - 1) + (32 - number_leading_zero_bits (top_integer)) '. –

1

In Java werden BigIntegers nicht als Strings oder Bytes mit jeweils einer Ziffer gespeichert. Sie werden als ein Array von 32-Bit-Ganzzahlen gespeichert, die zusammen die sogenannte Größe des BigIntegers bilden. Es kann keine führenden ganzen Zahlen (*) geben, daher wird der BigInteger so kompakt wie möglich gespeichert.

Die "Wörter" sind diese 32-Bit-Ganzzahlen. Sie sind keine Gruppen von 9 Ziffern, sie werden vollständig verwendet, also zählt jedes Bit.

Also müssen Sie nur wissen, wie viele 32-Bit-Integer gespeichert sind, das ist die Länge des internen Arrays mal 32. Aber die obere ganze Zahl kann noch führende Nullen haben, also müssen Sie die Anzahl der führenden Nullen erhalten dass Spitzen integer und subtrahieren sie von dem erhaltenen Produkt, in Pseudo-Code:

numBits = internalArray.length * 32 - numberOfLeadingZeroBits(internalArray[0]); 

Hinweis, dass die interne Anordnung wird mit der Oberseite integer an der niedrigsten Adresse (I keine Ahnung, warum das so ist) gespeichert, so dass die Die oberste Ganzzahl befindet sich im Index 0 des Arrays.


(*) In Wirklichkeit ist die oben etwas komplizierter ist, da das oberste Element aus dem Anfang des Arrays versetzt an einem gespeichert werden (wahrscheinlich bestimmte Berechnungen einfacher zu machen), sondern zu verstehen, die Mechanismus können Sie so tun, als gäbe es keine zusätzlichen ganzen Zahlen.

+0

Ihre Antwort hat ziemlich alles erklärt. Aber im Code haben sie zuerst die Anzahl der Bits berechnet, die jede ganzzahlige Zahl einnimmt, und dafür denke ich, dass die folgende Antwort funktioniert, nämlich log (10)/log (2). – Diffy

+0

Im Code verwenden sie nur die Anzahl der Bits, die eine Ziffer belegt, um Puffer einer geeigneten Größe zuzuordnen (z. B. für toString() oder für Parsing), aber bestimmt nicht, um die Bitlänge zu berechnen. –