0

私は常にstreams、printf、string(x)、または数値型を文字列に変換したり、逆に変換したりするために提供されている問題の言語を使用してきました。しかし、私はこれが実際にどのように行われるかを実際に考えたことはありません。私はグーグルで検索しましたが、すべての結果はそれらのさまざまな方法を使用するだけであり、変換が実際に舞台裏でどのように行われるかではありません:(

2進数、8進数、16進数を使用する整数の場合、文字列の各「数字」はビットのセットグループを表すため(たとえば、xxxxyyyyを知っている2つの16進数)、ビットシフトと1つを取ることでそれを行うことができます。一度に1桁ずつ、たとえば16進文字列0xFA20の場合、値は「(15 << 12)|(10 << 8)|(2 << 4)|(0 << 0)」です。

10進数の整数は、基数10がそのように基数2にマップされないため、より困難です。したがって、1ビットが複数の10進数に影響を与え、双方向の変換がより複雑になる可能性があります。

浮動小数点数については、私にはよくわかりません。全体と小数部分を別々に考えることができると思いますか?指数関数、有効数字の設定数、または小数点以下の桁数の設定はどうですか?

4

3 に答える 3

1

私はグーグルで検索しましたが、すべての結果はそれらのさまざまな方法を使用するだけであり、変換が実際に舞台裏でどのように行われるかではありません:(

パフォーマンス上の理由から、ある表現から別の表現への変換(特に浮動小数点/整数変換)は、多くの場合、低レベルのCPU命令であり、プロセッサレベルで実装されます。そのため、通常、ライブラリや言語レベルで再実装されることはありません。

これは、たとえば、波形を取得して、それをある範囲の離散整数値に変換する信号処理の世界では特に一般的です。

于 2010-08-23T15:18:52.213 に答える
1

10進数の変換は少し遅くなりますが、それほど複雑ではありません。おそらく実際のコードで書くのと同じように、16進変換をもう少し見てみましょう。たとえば、C ++では、次のような変換を行うことができます。

char digits[] = "0123456789abcdef";
std::string result;

int input = 0xFA20;

while (input) {
    int digit = input & 0xf; // or: digit = input % 0xf;
    input >>= 4;             // or: input /= 16;
    result.push_front(digits[digit]);
}

ただし、現時点では、いくつかのマジックナンバーがあります。それらを取り除きましょう:

const int base = 16;

while (input) { 
    int digit = input % (base - 1);
    input /= base;
    result.push_front(digits[digit]);
}

これらのマジックナンバーを取り除く過程で、ルーチンをほぼユニバーサルにしました。「base」の値を変更しても、ルーチンの残りの部分は引き続き機能し、入力を指定されたベースに変換します。基本的に、16より大きいベースをサポートする場合は、「数字」配列にさらに追加する必要がある他の唯一の変更です。

これはまた、簡単にするためにいくつかのことを無視します。最も明らかに、数値が負の場合は、通常、フラグを設定して正の数値に変換し、最後にフラグが設定されている場合は、文字列に「-」を入力します)。2の補数を使用すると、最大で負の数のコーナーケースがあります。これは、正の数に変換できません(より範囲の広い型に変換しないと)。通常、ほとんどのタイプを宣伝することでこれに対処します。最大の整数型(プロモートできない)の場合、通常、その1つの値をハードコーディングするのが最も簡単です。

原則として、浮動小数点はそれほど違いはありません。基本的に、一度に1桁を生成するために数学的な操作を行います。実際、フィールド幅と精度の変数だけでなく、通常、いくつかの異なる形式(少なくとも「基本」浮動小数点とある種の「科学的」形式)を処理する必要があるため、より複雑になります。これに対処するまでに、数百行程度のコードが作成されることになります。特に法外な量ではありませんが、ここに含めるのはおそらく少し意味があります。

于 2010-08-23T15:52:48.343 に答える
0

整数の場合、除算の剰余を見つけることができます。これは最後の桁であり、10で除算し、モジュラー剰余を見つけます。これは1桁ですが、最後の桁です。浮動小数点数は、有効数字と指数の2つの部分で構成されます。つまり、数値=有効数字*(基数^指数)です。基数は10、2、またはその他の数値です。

于 2010-08-23T15:20:48.483 に答える