le_*_*e_m 5 algorithm logarithm biginteger bit
给定一个大的十进制整数,如何计算位长度,即其二进制表示的位数?
\n\n例子: bitlength("590295810358705712624") == 70
算术表达式为:bitlength = \xe2\x8c\x8alog\xe2\x82\x82(n)\xe2\x8c\x8b + 1
对于小整数,此表达式可以转换为标准库调用。但是对于具有任意位数的大整数呢?
\n\nlog\xe2\x82\x82
我们可以从一位或两位前导数字计算出非常接近的估计值:
log\xe2\x82\x82(8192) \xe2\x89\xa5 log\xe2\x82\x82(8100) = log\xe2\x82\x82(81) + log\xe2\x82\x82(10) * 2 = 12.98...\n
Run Code Online (Sandbox Code Playgroud)\n\n将其代入上面的算术表达式中,我们得到了一个非常好的位长度下界。但在某些情况下,我们必须检查更多数字,可能直到最不重要的数字,才能得到准确的结果:
\n\nbitlength("1125899906842623") == 50\nbitlength("1125899906842624") == 51\n
Run Code Online (Sandbox Code Playgroud)\n\n关于如何在所有情况下准确有效地计算位长度有什么建议吗?
\n我曾经写过一个关于如何将作为字符串给出的任意大小的数字转换为十六进制数字字符串的答案: https ://stackoverflow.com/a/2653006/64121
您可以很容易地将其改编为二进制字符串并获取它的长度(或者直接计算长度)。一种更懒的方法是保留十六进制版本并将除第一个数字之外的所有数字计算为四个二进制数字,最后检查第一个数字的确切位长度。