2016-04-16 5 views
0

StringBigIntegerに変換している間、Javaは内部的にBigInteger内のビット数とワード数(各単語は考えると9個の整数の集合です)を計算します327 numWordsBigInteger.ビット数とワード数を計算するBigInteger

は、私はライン325でnumBitsを計算するために使用されるロジック、その後、ライン326でnumWordsのためのロジックを理解していないことを収容することができ、アレイを作成するために、次に使用され、行ごとに325からhereを見ました。

論理的には、文字列 "123456 789 "、numWordsは1、" 12345678912 "の場合はnumWordsは2にする必要がありますが、必ずしもそうではありません。たとえば、 "12345678912345678912"の場合、numWordsは3でなければなりませんが、2になるはずです。

誰も325番と326番で使用されているロジックを説明できますか?

+0

従来の16ビットモードでは、ワードは16ビットまたは2 8バイトまたは整数で表されます。 32ビットモードでは、32ビットまたは4バイトの整数がワードに取って代わる。 326の線は2の補数と同じように見えます。 – t0mm13b

答えて

1

進数としてnumDigitsの小数点数を表すために、それは

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

ビットを必要とします。 bitsPerDigit[10]上記計算において

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

3402あります。

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

私は計算を知っています。私は、ビットの数を計算する際の論理( 'numBits')を理解したかったのです。 – Diffy

+0

Javaでは、BigIntegerは32ビット整数の配列として配列されています。先行するゼロの整数は許されないので、表現は常に正規化されます(できるだけコンパクトです)。これにより、擬似コードのビット数を簡単に計算できます。 '32 *(array_length - 1)+(32 - number_of_leading_zero_bits(top_integer))'。 –

1

Javaでは、BigIntegerはそれぞれ数字の文字列またはバイトとして格納されません。それらは、一緒になってBigIntegerの大きさを形成する32ビット整数の配列として格納されます。先行ゼロの整数(*)は存在しないため、BigIntegerは可能な限りコンパクトに格納されます。

「言葉」は、これらの32ビットの整数です。彼らは9桁のグループではなく、完全に使用されているので、各ビットがカウントされます。

したがって、内部配列の長さは32である32ビット整数が格納されていることだけを知る必要があります。しかし、一番上の整数は先行ゼロを持つことができます。したがって、先頭のゼロの数を取得する必要があります。その上部整数擬似コードでは、得られた生成物からそれらを減算内部配列は最下位アドレス(私は理由は分からない)での上面整数で格納されていることを

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

注、そう一番上の整数は配列のインデックス0にあります。実際には


(*)一番上の項目は、(おそらく、特定の計算を容易にするために)、配列の先頭からのオフセットで保存することができるが、理解しているので、上記、もう少し複雑ですメカニズムでは、余分な整数がないふりをすることができます。

+0

あなたの答えは、ほとんどすべてを説明しています。しかし、コードでは、最初に、各整数桁が占めるビット数を計算しました。そのためには、以下の答えが動作すると思います。つまり、 'log(10)/ log(2)'です。 – Diffy

+0

コードでは、適切なサイズのバッファを割り当てるのに(例えば、 'toString()'または構文解析のために)桁が占めるビット数を使用しますが、確かにビット長を計算しません。 –