1

宿題として c++ 任意整数ライブラリを作成しています。数値を基数 10^n の unsigned int のベクトルとして内部的に表現しました。ここで、n は 1 つの unsigned int 数字に収まる範囲で可能な限り大きくします。

この選択は、スペース、パフォーマンス、数字アクセスの間のトレードオフとして行いました (人間が読める文字列に変換する際に複雑さを加えることなく、基数 10 を使用するよりもはるかに優れたパフォーマンスを得ることができます)。

たとえば、次のようになります。

base10(441243123294967295) 18桁

base1000000000(441243123,294967295) 2桁(カンマ区切り)

uint32 による内部表現

[00011010 01001100 11010101 11110011] [00010001 10010100 11010111 11111111]

宿題を完了するには、ビット シフトとその他のビット単位の演算子を実装する必要があります。そのような内部表現を持つ数値のシフトを実装することは理にかなっていますか?

内部表現のすべてのビットが有効になるように、基数 2^n に変更する必要がありますか?

4

3 に答える 3

2

内部表現のすべてのビットが有効になるように、基数 2^n に変更する必要がありますか?

間違いなくそうです!

それだけでなく、現代のコンピューターは一般的にすべて base2 を使用しています。これが演習である場合は、おそらくそれをうまく行う方法を学びたいと思うでしょう.

于 2012-09-09T14:50:01.093 に答える
2

できますが、する必要はありません後で解釈するために使用するベースに関係なく、ビットシフトは数値を 2 倍にしますint。シフトは実装が難しくなるため、実装ではトレードオフを決定する必要があります。一方、base-10 での印刷はより単純なままです。

10 進法を優先するもう 1 つの解決策は、2 進化 10 進数(BCD)を使用することです。昔、これらの操作を高速化するために使用されたハードウェア (たとえば、6502、Apple-2 の CPU) には、BCD 解釈にバイトを追加するための特別な命令が含まれていました。この表現を使用する場合は、特別な修正を実装する必要がありますが、これは学習に値する演習になる可能性があります。

于 2012-09-09T14:55:46.253 に答える
1

この種のライブラリはすべて基数 2 を使用します。これには、処理の高速化、ビット演算の可能性、ストレージのコンパクト化などの理由があります。これらの利点は、10 進数に変換する難しさを上回ります。したがって、バイナリに変換することを強くお勧めします。

于 2012-09-09T14:53:02.617 に答える