从没有 sprintf() 或模的整数中提取数字
Posted
技术标签:
【中文标题】从没有 sprintf() 或模的整数中提取数字【英文标题】:Extract Digits From An Integer Without sprintf() Or Modulo 【发布时间】:2010-01-20 21:51:33 【问题描述】:由于最终将在(GPU)上实现的机器,此要求有些限制。
我有一个无符号整数,我正在尝试提取每个单独的数字。
如果我在普通硬件上使用 C++ 执行此操作,并且性能不是主要问题,我可能会这样做:
(不要因为这段代码讨厌我,它只是一个示例来说明方法)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
int someVal = 1234;
char stringVal[256] =0;
sprintf(stringVal, "%016d", someVal);
int digits[16] = 0;
for( int i = 0; i < strlen(stringVal); ++i )
digits[i] = stringVal[i] - '0';
cout << "Integer Value = " << someVal << endl;
cout << "Extracted Digits = ";
copy( &digits[0], &digits[16], ostream_iterator<int>(cout, "-") );
cout << endl;
return 0;
我正在尝试找到一种方法来提取这些数字,但有以下限制:
-
不要将整数转换为字符串
不要使用模运算符(浮点除法很好)
有问题的值是一个 32 位无符号整数
我正在寻找一种算法,不一定是特定的代码。但是具体的代码会很棒。我最熟悉的可以很好地转换为我的目标硬件的语言是 C++、C 和汇编程序。
有什么想法吗?
编辑:这是我根据下面的 cmets 和链接实现的算法的更新。谢谢大家。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
unsigned someVal = 12345678;
static const unsigned numDigits = 10;
unsigned digits[numDigits] = 0;
for( unsigned i = 0, temp = someVal; i < numDigits; ++i, temp /= 10 )
digits[numDigits-i-1] = temp - 10 * (temp/10) /*temp % 10*/;
cout << "Integer Value = " << someVal << endl;
cout << "Extracted Digits = ";
copy( &digits[0], &digits[numDigits], ostream_iterator<int>(cout, "-") );
cout << endl;
return 0;
【问题讨论】:
你能floor
任何结果浮动吗?
@Anon。 : 不确定,让我对此进行一些研究......
@John:你可以进行类型转换
@Anon & Kornel Kisielewicz:浮点地板和天花板都很好,整数和浮点之间的转换也是如此。 Integer floor & ceil 有点不清楚,但由于 i-f 转换很便宜,我可以这样。
只是好奇,为什么要避开%
?
【参考方案1】:
请记住,取模运算符实际上可以实现为:
mod(a, n) = a - n * floor(a / n)
因此,您可以使用自己喜欢的基于模的算法。您可以通过类型转换来模拟地板本身。
【讨论】:
【参考方案2】:在 Bob Stout 的 sn-ps 中查看 C 档案下的 here 和 C++ 档案下的 here。不仅 sn-ps 存档力求可移植。
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
+1:还没有找到任何具体到我的问题的东西,但是链接的大道具。看起来里面有很多很酷的东西。 另外,看这里forum.codecall.net/c-c/6083-extracting-singel-digits-int.html查看算法【参考方案3】:One worth considering,作者 Terje Mathisen。
【讨论】:
以上是关于从没有 sprintf() 或模的整数中提取数字的主要内容,如果未能解决你的问题,请参考以下文章