[英]hex string arithmetic in c++
我想用表示为字符串的64位十六进制数字进行基本算术(加,减和比较)。 例如
"ffffa"+"2" == "ffffc"
由于此类数字的二进制表示形式需要256位,因此我无法将字符串转换为基本整数类型。 一种解决方案是使用gmp
或boost/xint
但是对于这种简单功能boost/xint
,它们太大了。
有没有可以帮助我的轻巧解决方案?
自己对固定基数的字符串进行加,减和比较应该很容易。
例如,对于加法和减法,只需像您在纸上所做的那样简单:从两个字符串的右端开始,分析char
,计算结果,然后进行累加等等。比较更加容易,并且您从左到右。
当然,所有这些都是假设您不需要性能(否则您应该使用适当的库)。
只需编写一个库即可处理在十六进制到int之间转换的字符串,并一次添加一个char,以防溢出。 花了几分钟来实现这样的算法:
#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位的十六进制字符串,这仅取决于主机内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.