【问题标题】:Bit shifting on non contiguous internal number representation非连续内部数字表示的位移
【发布时间】:2012-09-09 14:47:50
【问题描述】:

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

我做出这个选择是为了在空间、性能和数字访问之间进行权衡(它使我的性能比使用 base 10 好得多,而且在转换为人类可读的字符串时不会增加任何复杂性)。

例如:

base10(441243123294967295) 18 位

base1000000000(441243123,294967295) 2 位数字(逗号分隔)

使用 uint32 的内部表示

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

为了完成作业,我必须实现位移和其他位运算符。 对具有这种内部表示的数字实现移位是否有意义?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      绝对是的!

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-27
          • 2011-09-30
          • 2014-07-14
          • 1970-01-01
          • 2021-08-22
          • 1970-01-01
          相关资源
          最近更新 更多