1

我正在编写一个 c++ 任意整数库作为作业。我在内部将数字表示为无符号整数的向量,以 10^n 为基数,其中 n 尽可能大,同时适合单个无符号整数数字。

我做出这个选择是为了在空间、性能和数字访问之间进行权衡(它允许我获得比使用 base 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

可以,但您不必:无论您稍后使用什么基数来解释它位移都会使数字加倍,因为在内部这些s 仍然被底层移位操作解释为二进制。你的实施将不得不决定那里的权衡,因为你的转变将变得更难实施。另一方面,base-10 中的打印将保持更简单。int

您可能会考虑使用十进制系统的另一种解决方案是使用二进制编码的小数 (BCD)。过去,用于加速这些操作的硬件(例如 6502,Apple-2 的 CPU)包括在 BCD 解释中添加字节的特殊指令。如果使用此表示,则必须进行特殊校正,但这可能是一个值得学习的练习。

于 2012-09-09T14:55:46.253 回答
1

这种类型的所有库都使用基数 2。他们这样做是有原因的:更快的处理速度、按位运算的可能性、更紧凑的存储等等。这些优势超过了转换为小数的难度。因此强烈建议您转换为二进制。

于 2012-09-09T14:53:02.617 回答