由於最終將在GPU上實現的機器的要求有限制。從一個整數中提取數字沒有sprintf()或Modulo
我有一個無符號整數,我試圖提取每個單獨的數字。
如果我在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和彙編程序。
任何想法?
編輯:下面是我使用基於下面的評論&鏈接實現的算法的更新。謝謝大家。
#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;
}
你可以'地板'任何產生的花車? – 2010-01-20 21:54:56
@Anon。 :不知道,讓我做一個小小的研究... – 2010-01-20 21:55:33
@約翰:你*可以* typecast然而 – 2010-01-20 21:57:09