在非连续内部数字表示上的位移位

时间:2012-09-09 14:47:51

标签: c++ bit-manipulation arbitrary-precision

我正在编写一个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,以便内部表示的所有位都有意义吗?

3 个答案:

答案 0 :(得分:2)

  

我应该更改为基数2 ^ n,以便内部表示的所有位都有意义吗?

绝对是肯定的!

不仅如此,现代计算机一般都是关于base2的。如果这是一个练习,你很可能想学习如何做好。

答案 1 :(得分:2)

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

您可能会考虑使用binary-coded decimals (BCD)支持十进制系统的另一个解决方案。在当天,用于加速这些操作的硬件(例如6502,Apple-2的CPU)包括在BCD解释中添加字节的特殊指令。如果您使用此表示法,则必须实施特殊校正,但这可能是值得学习的练习。

答案 2 :(得分:1)

此类所有库都使用base 2.他们之所以这样做是有原因的:更快的处理速度,按位操作的可能性,更紧凑的存储空间等等。这些优势超过了转换为十进制的难度。因此,强烈建议您转换为二进制文件。