在没有sprintf()或Modulo的情况下从整数中提取数字

时间:2010-01-20 21:51:34

标签: c++ c algorithm assembly

由于最终将在(GPU)上实现的机制,因此对此的要求有些限制。

我有一个无符号整数,我试图提取每个数字。

如果我在普通硬件和C ++上使用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;
}

我正在尝试找到一种方法来提取这些数字,但有以下限制:

  1. 不要将整数转换为字符串
  2. 不要使用模数运算符(浮点除​​法很好)
  3. 有问题的值是32位无符号整数
  4. 我正在寻找一种算法,不一定是具体的代码。但具体的代码会很棒。我最熟悉的语言很好地转换为我的目标硬件是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;
    }
    

3 个答案:

答案 0 :(得分:7)

请记住,模运算符实际上可以实现为:

mod(a, n) = a - n * floor(a / n)

因此,您可以使用自己喜欢的基于模数的算法。您可以通过类型转换来模拟地板本身。

答案 1 :(得分:1)

在C存档下的Bob Stout的片段中查看here,在C ++存档下查看here。不仅仅是片段档案可以随身携带。

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:1)

One worth considering,Terje Mathisen。