3

本当の問題は、base2/binary を base10 に変換する方法だと思います。これの最も一般的なアプリケーションは、おそらく出力用の文字列を作成することです。つまり、バイナリ数値データのチャンクを文字の配列に変換します。これはどのように正確に行われますか?

私の推測: 数値ごとに事前定義された文字列はおそらくないので、コンピューターは整数の各ビットを右から左に調べ、char 配列/base10 表記で適切な値をインクリメントするたびに推測しています。場所。160 を 2 進数 (10100000) にすると、8 番目の 1 は 128 を意味することがわかり、3 番目の列に 1、2 番目の列に 2、3 番目の列に 8 が配置されます。6 列目の 1 は 32 を意味し、これらの値を 2 番目と 1 番目に追加し、必要に応じて繰り越します。この後、実際の文字コードに簡単に変換できます。

4

4 に答える 4

2
while number != 0:
    nextdigit = number % 10
    AddToLeft(result, convert nextdigit to char)
    number = number / 10

読者がゼロと負の数を処理するための演習として残されています。

于 2010-03-23T23:10:48.070 に答える
1

それがどのように行われるかは、プラットフォームによって異なります。たとえば、Intel タイプのプロセッサには、パックされた BCD (Binary Coded Decimal) 演算のサポートが組み込まれています。

レジスタalに 2 進数の 00101010、10 進数の 42 が含まれているとします。

fushf ;store flags on the stack
std ;set decimal flag
sub bl, bl ;clear bl register
add bl, al ;add al to bl using BCD arithmetics
pop ;restore flags from stack

レジスタにはbl01000010 が含まれています。

上位 4 ビットには 0100、つまり 10 進数
の 4 が含まれます。下位 4 ビットには 0010、つまり 10 進数の 2 が含まれます。

これを文字に変換するには、レジスタから 4 ビット値を抽出し、48 を加算して数字の文字コードを取得します。

于 2010-03-23T23:51:46.077 に答える
1

printfLinux カーネルでの の実装はかなり読みやすいです。lib/vsprintf.c:nu​​mber()を参照してください。

まあ、まあ、ほとんどかなり読みやすいです。 do_divアセンブラを含むマクロです。

于 2010-03-24T00:02:03.900 に答える
-1

まず、明らかにプラットフォームと言語に基づいているため、これは難しい質問です。

Java を例にとってみましょう。int として宣言された整数は、実際には 32 ビット長です。

したがって、0 の 10 進値を表すには、

1000000000000000000000000000000 <== 先頭の 1 (またはゼロ?) は、正かどうかを示します。

これは、Java が int 値を半分負と半分正として格納するためです...

したがって、Javaは次のことを行うと思います:

step1 : 変数またはリテラルの「ポインタ」が指す 32 ビット メモリのチャンクからコンテンツを取得する

step2 : 大きな数値が 0 に変換されるように 10 進値を計算する

step3 : (jdk5+) Int32.toString() を使用して文字列リテラルを「0」として返す

私はこのような質問を考えたことがないので、これは間違っているかもしれません。

値を文字の配列に変換しようとする言語はないと思います。これは、追加するオーバーヘッドが大きいためです...

または、私の数学の経験に基づいて、バイナリ値を10進数に変換するには、そのリテラル表現ではなく、値に基づいて計算します:

    1    1  0  1  in binary

    1*2^3 + 1* 2^2 + 0*2^1 +1*2^0 = 13 in decimal     
于 2010-03-23T23:11:53.617 に答える