1

我想用表示为字符串的 64 位十六进制数字进行基本算术(加法、减法和比较)。例如

"ffffa"+"2" == "ffffc"

由于此类数字的二进制表示需要 256 位,因此我无法将字符串转换为基本整数类型。一种解决方案是使用gmp,或者boost/xint它们对于这个简单的功能来说太大了。

有没有可以帮助我的轻量级解决方案?

4

2 回答 2

2

自己在固定基数的数字字符串上实现加法、减法和比较应该很容易。

例如,对于加法和减法,只需像在纸上那样做:从两个字符串的右端开始,解析chars,计算结果,然后结转,等等。比较更容易,你去左到右。

当然,所有这些都是假设您不需要性能(否则您应该使用适当的库)。

于 2018-11-26T08:59:29.273 回答
2

只需编写一个库,该库将处理十六进制到整数之间转换的字符串,并一次添加一个字符,处理溢出问题。实现这样一个算法需要几分钟:

#include <cstdio>
#include <sstream>
#include <iostream>

using namespace std;

namespace hexstr {
    char int_to_hexchar(int v) {
        if (0 <= v && v <= 9) {
            return v + '0';
        } else {
            return v - 10 + 'a';
        }
    }
    int hexchar_to_int(char c) {
        if ('0' <= c && c <= '9') {
            return c - '0';
        } else {
            return c - 'a' + 10;
        }
    }
    int add_digit(char a, char b) {
        return hexchar_to_int(a) + hexchar_to_int(b);
    }
    void reverseStr(string& str) { 
        int n = str.length(); 
        for (int i = 0; i < n / 2; i++) 
            swap(str[i], str[n - i - 1]); 
    }
    void _add_val_to_string(string& s, int& val) {
        s.push_back(int_to_hexchar(val % 16));
        val /= 16;
    }
    string add(string a, string b)
    {
        auto ita = a.end();
        auto itb = b.end();
        int tmp = 0;
        string ret;

        while (ita != a.begin() && itb != b.begin()) {
            tmp += add_digit(*--ita, *--itb);
            _add_val_to_string(ret, tmp);
        }
        while (ita != a.begin()) {
            tmp += hexchar_to_int(*--ita);
            _add_val_to_string(ret, tmp);
        }
        while (itb != b.begin()) {
            tmp += hexchar_to_int(*--itb);
            _add_val_to_string(ret, tmp);
        }
        while (tmp) {
            _add_val_to_string(ret, tmp);
        }

        reverseStr(ret);

        return ret;
    }
}

int main()
{
    std::cout 
        << "1bd5adead01230ffffc" << endl
        << hexstr::add(
                std::string() + "dead0000" + "00000" + "ffffa", 
                std::string() + "deaddead" + "01230" + "00002"
        ) << endl;
    return 0;
}

这可以优化,可以省略反转字符串,并节省一些 cpu 周期和内存分配。也缺乏错误处理。它仅适用于使用 ASCII 表作为字符集等的实现......但它就是这么简单。我猜这个小库可以处理超过 64 位的任何十六进制字符串,仅取决于主机内存。

于 2018-11-26T09:58:02.893 回答