Joh*_*ing 2 c c++ algorithm assembly
由于最终将在(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;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试找到一种方法来提取这些数字,但有以下限制:
我正在寻找一种算法,不一定是具体的代码.但具体的代码会很棒.我最熟悉的语言很好地转换为我的目标硬件是C++,C和汇编程序.
有任何想法吗?
编辑: 这是我根据下面的评论和链接实施的算法的更新.谢谢大家.
#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;
}
Run Code Online (Sandbox Code Playgroud)
请记住,模运算符实际上可以实现为:
mod(a, n) = a - n * floor(a / n)
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用自己喜欢的基于模数的算法.您可以通过类型转换来模拟地板本身.