c++ - 从没有 sprintf() 或模数的整数中提取数字

标签 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;
}

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

  1. 不要将整数转换为字符串
  2. 不要使用取模运算符(浮点除​​法没问题)
  3. 所讨论的值是一个 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;
}

最佳答案

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

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

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

关于c++ - 从没有 sprintf() 或模数的整数中提取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105272/

相关文章:

带有 static_assert 错误的 C++ 模板

c++ - 使用C++从URL读取文件而不是使用点云库读取本地文件

c++ - 使用功能测试宏和 Clang 时如何避免有关 c++Future-extensions 的警告?

c - 如何在 gcc 中获取当前的 c 方言?

algorithm - Mysql 确定最接近颜色匹配的算法

algorithm - k-Means 的单 channel 种子选择算法

c++ - 如何修复这个简单的 Makefile 错误?

c - 与聚合或 union 类型相关的严格别名

使用 FFTW 计算 PSD

algorithm - 如何找到其中有循环的链表的长度?