为了动态访问整数的第一个数字,使用 String 还是 Division 更有效?
In order to access first Digit of an integer dynamically, is using a String or Division more efficient?
我读到过两种方法,重复除以 10(或者稍微更有效,以最小化除法运算的方式除法)即
int getFirstDigit(unsigned int num) {
if (num >= 100000000)
num /= 100000000;
if (num >= 10000)
num /= 10000;
if (num >= 100)
num /= 100;
if (num >= 10)
num /= 10;
return num;
}
来源:How to retrieve the first decimal digit of number efficiently
对于 unsigned int,这将最多除以 3 次,减少除法操作,据我所知,这是最昂贵的汇编操作。我的问题是,这与以下字符串操作相比如何:
int getFirstDigit(unsigned int num) {
return (to_string(num))[0] - '0';
}
它转换为字符串,获取字符,然后偏移 48 以获得该字符将代表的纯数字。我确实知道字符串与大量开销有关,我四处看了看,但找不到比较两者的具体答案。
事后思考:我在我之前记入的页面中看到了一个日志,我想我可以取数字的日志基数 10,将结果取底,看看它从下面绑定的 10 的顺序,然后使用该数字作为 10 的指数,他们将我正在查看的数字相除,将其简化为对数运算、幂运算和除法运算。如果那甚至减少了它。但同样,我不知道相对 运行 次。
提前抱歉,我确实看到了很多 相似的 问题,但是 none 我觉得回答了我相对 运行 次的具体问题关于装配级别的效率。我的直觉告诉我除法比字符串好得多,但我不能确定,因为字符串只是内存中连续的 ascii 值。
简短回答:在您分析(基准)您的代码之前没有人知道!
更长的答案:模+除法应该比涉及字符串转换的任何版本都快,但也有例外:没有任何内置硬件支持,任何itoa
/ to_string
除了字符串分配之外,实现还需要执行您已经按需要执行的相同的相对昂贵的模和除法(因为您正在从一个基数转换为另一个基数),因此仅执行模数和除法操作应该更快。
这取决于您的平台 - 如果您使用的是 Java 或 C#,那么您的运行时(分别是 JVM 和 CLR)使用高度优化的平台特定代码在内部实现 ToString
操作这可能比自己做算术更快,即使他们的版本包括字符串分配。
我读到过两种方法,重复除以 10(或者稍微更有效,以最小化除法运算的方式除法)即
int getFirstDigit(unsigned int num) {
if (num >= 100000000)
num /= 100000000;
if (num >= 10000)
num /= 10000;
if (num >= 100)
num /= 100;
if (num >= 10)
num /= 10;
return num;
}
来源:How to retrieve the first decimal digit of number efficiently
对于 unsigned int,这将最多除以 3 次,减少除法操作,据我所知,这是最昂贵的汇编操作。我的问题是,这与以下字符串操作相比如何:
int getFirstDigit(unsigned int num) {
return (to_string(num))[0] - '0';
}
它转换为字符串,获取字符,然后偏移 48 以获得该字符将代表的纯数字。我确实知道字符串与大量开销有关,我四处看了看,但找不到比较两者的具体答案。
事后思考:我在我之前记入的页面中看到了一个日志,我想我可以取数字的日志基数 10,将结果取底,看看它从下面绑定的 10 的顺序,然后使用该数字作为 10 的指数,他们将我正在查看的数字相除,将其简化为对数运算、幂运算和除法运算。如果那甚至减少了它。但同样,我不知道相对 运行 次。
提前抱歉,我确实看到了很多 相似的 问题,但是 none 我觉得回答了我相对 运行 次的具体问题关于装配级别的效率。我的直觉告诉我除法比字符串好得多,但我不能确定,因为字符串只是内存中连续的 ascii 值。
简短回答:在您分析(基准)您的代码之前没有人知道!
更长的答案:模+除法应该比涉及字符串转换的任何版本都快,但也有例外:没有任何内置硬件支持,任何itoa
/ to_string
除了字符串分配之外,实现还需要执行您已经按需要执行的相同的相对昂贵的模和除法(因为您正在从一个基数转换为另一个基数),因此仅执行模数和除法操作应该更快。
这取决于您的平台 - 如果您使用的是 Java 或 C#,那么您的运行时(分别是 JVM 和 CLR)使用高度优化的平台特定代码在内部实现 ToString
操作这可能比自己做算术更快,即使他们的版本包括字符串分配。