2

主な質問: 桁数は?

説明させてください。2進法で11000000、10進法で192という数字があります。

10進数に換算すると何桁になりますか?私の例では、3桁です。しかし、それは問題ではありません。インターネットで検索したところ、整数部用のアルゴリズムと小数部用のアルゴリズムが見つかりました。私はそれらをよく理解していませんが、(私は思うに)それらは機能します。

2 進数から 8 進数への変換はより簡単です。3 ビットごとに 1 桁の 8 進数が得られます。16 進数も同様です。各 4 ビット = 1 桁の 16 進数。

しかし、私は非常に興味があります.P数字システムの数字を持っていて、それをQ数字システムに変換したい場合はどうすればよいですか? 私はそれを行う方法を知っています(私は知っていると思います:))が、まず第一に、Qシステムで何桁かかるかを知りたいです(いいえ、スペースを事前に割り当てる必要があります)。

4

7 に答える 7

6

基数bにnを書き込むと、上限 (対数基数 b (n))桁になります。

お気づきの比率 (8 進数/2 進数) は、log base 8 (n) / log base 2 (n) = 3です。

(記憶から、くっつきますか?)

于 2009-06-07T17:05:42.980 に答える
5

基数 B で X 桁の長さの数値がある場合、表現できる最大値は B^X - 1 です。したがって、基数 C で何桁になるかを知りたい場合は、 C^Y - 1 が少なくとも B^X - 1 と同じ大きさである数 Y。これを行う方法は、B^X-1 の C を底とする対数を取ることです。また、基数 C の数値の対数 (log) は、その数値の自然対数 (ln) を C の自然対数で割ったものと同じであるため、次のようになります。

Y = ln((B^X)-1) / ln(C) + 1

ln(B^X) は X * ln(B) であるため、おそらく ln(B^X-1) よりも計算が速く、正しい答えに十分近いため、次のように書き換えます。

Y = X * ln(B) / ln(C) + 1

それをあなたの好きな言語に変換してください。「-1」を省略したため、場合によっては必要以上に 1 桁多くなる場合があります。しかし、さらに良いことに、ln(B)/ln(C) を事前に計算し、それに新しい「X」を掛けるだけで、変換しようとしている数値の長さが変わります。

于 2009-06-07T17:09:20.107 に答える
5

私の以前の回答には誤りがありました。Ben Schwehn のコメントを見てください。混乱して申し訳ありませんが、以前の回答で犯したエラーを見つけて説明します。

Paul Tomblin が提供する回答を使用してください。(P、Q、および n を使用するように書き直されました)

Y = ln(P^n) / ln(Q)
Y = n * ln(P) / ln(Q)

したがって、Y (切り上げ) は、システム P で n 文字にエンコードできる最大数を表すためにシステム Q で必要な文字数です。

与えられた数値 1000(bin) = 8(dec) の最小値を取得するための答えはありません (数値はまだ変換されておらず、一時変数に多くのスペースが必要です) を使用して小数点以下 2 桁を予約します。この式。

一時的なメモリの使用が問題にならない場合は、チートして使用することができます (Python):

len(str(int(otherBaseStr,P)))

これにより、文字列 (otherBaseStr) としてキャストされた基数 P の数値を 10 進数に変換するために必要な 10 進数の数が得られます。


古い間違った答え:

長さ n の P 数字システムの数字がある場合、n 文字で可能な最大数を計算できます。

P^(n-1)

数体系 Q でこの最大数を表すには、対数を使用する必要があります (対数はべき乗の逆であるため)。

log((P^(n-1))/log(Q)
(n-1)*log(P) / log(Q)

たとえば、バイナリの 11000000 は 8 文字です。Decimal で取得するには、次のものが必要です。

(8-1)*log(2) / log(10) = 2.1 digits (round up to 3)

間違っていた理由:

n 文字で可能な最大数は

(P^n) - 1

いいえ

P^(n-1)
于 2009-06-07T17:23:46.220 に答える
1

桁数の計算は、他の回答で与えられた式を使用して行うことができますが、実際には、対数を計算する代わりに、最初に最大サイズのバッファーを割り当ててから、そのバッファーの関連部分を返す方が速い場合があります。

バッファー サイズの最悪のケースは、バイナリに変換するときに発生することに注意してください。これにより、32 ビット整数に対して 32 文字のバッファー サイズが得られます。

数値を任意の基数に変換するには、以下の C# 関数を使用します (コードは、C や Java などの他の言語でも非常によく似ています)。

public static string IntToString(int value, char[] baseChars)
{
    // 32 is the worst cast buffer size for base 2 and int.MaxValue
    int i = 32;
    char[] buffer = new char[i];
    int targetBase= baseChars.Length;

    do
    {
        buffer[--i] = baseChars[value % targetBase];
        value = value / targetBase;
    }
    while (value > 0);

    char[] result = new char[32 - i];
    Array.Copy(buffer, i, result, 0, 32 - i);

    return new string(result);
}
于 2009-06-07T17:19:23.103 に答える
0

小数部分の長さを個別に計算する必要があります。

2 進数から 10 進数への変換では、ビット数と同じ数の 10 進数があります。たとえば、2 進数の 0.11001101001001 は 10 進数の 0.80133056640625 で、両方とも小数点以下 14 桁です。

10 進数から 2 進数への場合、2 つのケースがあります。小数部が 2 進数の場合、10 進数同じ数のビットがあります (上記の 2 進数から 10 進数の場合と同じです)。分数が 2 進でない場合、ビット数は無限です。

(私の10 進/2 進コンバーターを使用して、これを試すことができます。)

于 2009-06-08T00:17:18.943 に答える
0

ここでのキーワードは「対数」です。示唆的なリンクがいくつかあります。

http://www.adug.org.au/MathsCorner/MathsCornerLogs2.htm

http://staff.spd.dcu.ie/johnbcos/download/Fermat%20material/Fermat_Record_Number/HOW_MANY.html

于 2009-06-07T17:05:34.463 に答える
0

対数の底 P と底 Q を見てください。最も近い整数に切り捨てます。

対数の底 P は、好みの底 (10 または e) を使用して計算できます: log_P(x) = log_10(x)/log_10(P)

于 2009-06-07T17:06:38.643 に答える