Требования этого являются несколько ограничительными из-за механизма, на котором это в конечном итоге будет реализовано (графический процессор).
У меня есть целое число без знака, и я пытаюсь извлечь каждую отдельную цифру.
Если бы я делал это в 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;
}