質問

私は常に、ストリーム、printf、文字列(x)、または問題の言語が数値タイプを文字列または背面に変換するために提供したものを常に使用してきました。しかし、私はこれが実際にどのように行われるかを本当に考えたことがありません。 Googleで検索しましたが、すべての結果は、これらのさまざまな方法を使用することであり、変換が実際に舞台裏で行われる方法ではありません:(

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

ベース10がそのようにベース2にマッピングされないため、小数integersはより困難です。

浮動小数点数に関しては、私は本当に知りません。全体と分数の部分は別々に考えることができると思いますか?指数関数として、かなりの数の数のセット数またはセット数の小数の場所はどうですか?

役に立ちましたか?

解決

小数の変換は少し遅くなりますが、実際にはそれほど複雑ではありません。おそらく実際のコードでそれを書くように、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]);
}

これらの魔法の数字を取り除く過程で、ルーチンをほぼ普遍的にしました。「ベース」の値を変更すると、残りのルーチンはまだ機能し、指定されたベースに入力を変換します。基本的に、私たちが行う必要がある他の唯一の変更は、16を超えるベースをサポートする場合、「数字」配列にさらに追加することです。

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

原則として、フローティングポイントはそれほど違いはありません。あなたはまだ基本的に数学的な操作を行い、一度に1桁を生成します。実際、通常、いくつかの異なる形式(少なくとも「基本的な」フローティングポイントと何らかの「科学的」形式)、およびフィールド幅と精度の変数を扱う必要があるという理由だけで、より複雑になります。あなたがそれを扱った頃には、あなたは数百行のコードなどになります - 特にとんでもない量ではありませんが、おそらくここに含めるのは理にかなっています。

他のヒント

Googleで検索しましたが、すべての結果は、これらのさまざまな方法を使用することであり、変換が実際に舞台裏で行われる方法ではありません:(

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

これは、たとえば波形を取得して、何らかの範囲の個別の整数値に変換する場合、信号処理の世界で特に一般的です。

整数の場合、分割の残りを見つけることができます。これは最後の数字で、10で除算、モジュラー残差が見つかりました - これは最後の数字以外の桁などです。浮動小数点数は、2つの部分の2つの部分で構成されています - 有意な数字と指数、IE番号= celige.digits *(base ^ exponent)、ベースは10、2、またはその他の数値です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top