计算整数的数字数即使更快

2021-06-04 23:28:41

我以前的博客文章,我记录了如何继续如何快速计算整数的数字数。例如,给定整数999,你想要3但给出整数1000,你想要4.它有效地是基数10中的整数对数。

在计算机上,您可以快速计算基数2中的整数对数,然后您可以从一个相当快地移动到另一个。您只需要一个纠正,您​​可以使用表格实现。在诸如黑客的喜悦之类的参考文献中找到的非常好的解决方案如下:

静态UINT32_T表[] = {9,99,999,9999,99999, 999999,9999999,99999999,999999999999,999999999}; int y =(9 * int_log2(x))> > 5; Y + = x>表[y]; 返回y + 1;

除了计算整数对数之外,它涉及乘法9,换档,条件移动,表查找和增量。你能做得更好吗?你可能! Kendall Willets发现了更经济的解决方案。

int fast_digit_count(uint32_t x){ 静态UINT64_T表[] = { 4294967296,8589934582,8589934582,8589934582,12884901788, 12884901788,12884901788,17179868184,17179868184,17179868184,17179868184,17179868184, 21474826480,21474826480,21474826480,21474826480,21474826480,25769703776, 25769703776,300769703776,30063771072,30063771072,30063771072, 34349738368,34349738368,34349738368,34349738368,34349738368,38554705664, 38554705664,38554705664,41949672960,41949672960,41949672960,41949672960, 42949672960,42949672960}; 返回(x +表[int_log2(x)])> > 32; }

如果我省略了基础2中的整数对数的计算,则需要表达表查找,添加和班次:

该表包含J的数字CEIL(log10(2 j))* 2 32 + 2 32 - 10 ceil(log10(2 j)),对于j为2到30,然后仅为CEIL(log10(2 j))for j = 31和j = 32.第一个值为2 32。