我正在编写一个c ++任意整数库作为作业。我在内部将数字表示为unsigned int的向量,在基数10 ^ n中,其中n尽可能大,同时适合单个无符号的int数字。
我做出了这个选择,作为空间,性能和数字访问之间的权衡(它允许我比使用基数10具有更好的性能,而不会在转换为人类可读字符串时增加任何复杂性。)
例如:
base10(441243123294967295)18位
base1000000000(441243123,294967295)2位数(以逗号分隔)
使用uint32的内部表示
[00011010 01001100 11010101 11110011] [00010001 10010100 11010111 11111111]
要完成作业,我必须实现位移和其他按位运算符。 对具有这种内部表示的数字实现shift是否有意义?
我应该更改为基数2 ^ n,以便内部表示的所有位都有意义吗?
答案 0 :(得分:2)
我应该更改为基数2 ^ n,以便内部表示的所有位都有意义吗?
绝对是肯定的!
不仅如此,现代计算机一般都是关于base2的。如果这是一个练习,你很可能想学习如何做好。
答案 1 :(得分:2)
你可以,但你不必须:无论你使用解释的基础,比特移位都会使数字加倍之后,因为内部这些int
仍然被底层的移位操作解释为二进制。您的实施将必须决定那里的权衡,因为您的转变将变得更难实施。另一方面,基础10中的打印将更加简单。
您可能会考虑使用binary-coded decimals (BCD)支持十进制系统的另一个解决方案。在当天,用于加速这些操作的硬件(例如6502,Apple-2的CPU)包括在BCD解释中添加字节的特殊指令。如果您使用此表示法,则必须实施特殊校正,但这可能是值得学习的练习。
答案 2 :(得分:1)
此类所有库都使用base 2.他们之所以这样做是有原因的:更快的处理速度,按位操作的可能性,更紧凑的存储空间等等。这些优势超过了转换为十进制的难度。因此,强烈建议您转换为二进制文件。