打印非常长的二进制表示的整数值

Print the integral value of a very long binary representation

本文关键字:整数 表示 二进制 打印 非常      更新时间:2023-10-16

假设您有一个很长的二进制(>64位),它表示一个无符号整型值,并且您想要打印实际的数字。我们讨论的是c++,因此假设您从一个bool[]std::vector或a std::bitset开始,并以一个std::string或某种std::ostream结束——随您的解决方案而定。但是请只使用核心语言和STL。

现在,我怀疑,你必须对它进行块计算,以获得一些中间结果,这些结果足够小,可以存储-最好是以10为基数,如x·10k。我能算出从这一点开始的集合数。但是因为没有块宽度对应于10的底数,我不知道怎么做。当然,您可以从任何其他块宽度开始,比如3,以x·(23)k的形式获得中间值,然后将其转换为以10为基数,但这将导致x·103·k·lg2显然具有浮点指数,这没有任何帮助。

不管怎样,我已经厌倦了这些数学废话,如果你能给我一个周到的建议,我会很感激的。

你的真诚,阿明

我假设您已经有了某种大整数除法/模函数,因为实现这样的事情完全是一场噩梦。

class bignum {
public:
   bignum(unsigned value=0);
   bignum(const bignum& rhs);
   bignum(bignum&& rhs);
   void divide(const bignum& denominator, bignum& out_modulo);
   explicit operator bool();
   explicit operator unsigned();
};
std::ostream& operator<<(std::ostream& out, bignum value) {
   std::string backwards;
   bignum remainder;
   do {
       value.divide(10, remainder);
       backwards.push_back(unsigned(remainder)+'0');
   }while(value);
   std::copy(backwards.rbegin(), backwards.rend(), std::ostream_iterator(out));
   return out; 
}

如果四舍五入是一个选项,那么将大多数二进制转换为double应该是相当简单的,这将是一个许多更快。也就是说,将64位最高有效位复制到unsigned long,将其转换为double,然后乘以2.0的有效位数减去64的次方。(我说有效位,因为你必须跳过任何前导零)
因此,如果你有150位有效位,将前64位复制到unsigned long,将其转换为double,并将其乘以std::pow(2.0, 150-64) ~ 7.73e+25得到结果。如果你只有40位有效位,在右边填上0仍然有效。将40位复制到unsigned long的MSB,将其转换为double,并将其乘以std::pow(2.0, 40-64) ~ 5.96e-8即可得到结果!

<标题>编辑

Oli Charlesworth发布了一个链接到维基百科的Double Dabble页面,这将我展示的第一个算法打了个水花。