【发布时间】:2015-11-23 04:34:20
【问题描述】:
这应该是一个有趣的问题,至少对我来说。
我的意图是操作 base-4 数字,编码为 无符号整数。然后每个两位块代表一个基数为 4 的数字,从 最低有效位开始:
01 00 11 = base4(301)
我想使用 SSE 指令优化我的代码,因为我不确定我在这里的得分如何,可能很差。
代码从字符串开始(并使用它们来检查正确性),并实现:
- 将字符串转换为二进制
- 二进制转字符串
- 倒数
欢迎任何提示!
uint32_t tobin(std::string s)
{
uint32_t v, bin = 0;
// Convert to binary
for (int i = 0; i < s.size(); i++)
{
switch (s[i])
{
case '0':
v = 0;
break;
case '3':
v = 3;
break;
case '1':
v = 1;
break;
case '2':
v = 2;
break;
default:
throw "UNKOWN!";
}
bin = bin | (v << (i << 1));
}
return bin;
}
std::string tostr(int size, const uint32_t v)
{
std::string b;
// Convert to binary
for (int i = 0; i < size; i++)
{
uint32_t shl = 0, shr = 0, q;
shl = (3 << (i << 1));
shr = i << 1;
q = v & shl;
q = q >> shr;
unsigned char c = static_cast<char>(q);
switch (c)
{
case 0:
b += '0';
break;
case 3:
b += '3';
break;
case 1:
b += '1';
break;
case 2:
b += '2';
break;
default:
throw "UNKOWN!";
}
}
return b;
}
uint32_t revrs(int size, const uint32_t v)
{
uint32_t bin = 0;
// Convert to binary
for (int i = 0; i < size; i++)
{
uint32_t shl = 0, shr = 0, q;
shl = (3 << (i << 1));
shr = i << 1;
q = v & shl;
q = q >> shr;
unsigned char c = static_cast<char>(q);
shl = (size - i - 1) << 1;
bin = bin | (c << shl);
}
return bin;
}
bool ckrev(std::string s1, std::string s2)
{
std::reverse(s1.begin(), s1.end());
return s1 == s2;
}
int main(int argc, char* argv[])
{
// Binary representation of base-4 number
uint32_t binr;
std::vector<std::string> chk { "123", "2230131" };
for (const auto &s : chk)
{
std::string b, r;
uint32_t c;
binr = tobin(s);
b = tostr(s.size(), binr);
c = revrs(s.size(), binr);
r = tostr(s.size(), c);
std::cout << "orig " << s << std::endl;
std::cout << "binr " << std::hex << binr << " string " << b << std::endl;
std::cout << "revs " << std::hex << c << " string " << r << std::endl;
std::cout << ">>> CHK " << (s == b) << " " << ckrev(r, b) << std::endl;
}
return 0;
}
【问题讨论】:
-
这段代码有效吗?您只是在寻找有关它的反馈吗?
-
是的,它有效,是的,我正在寻找反馈和优化它的方法,包括用 SSE 重写。我不知道 CodeReview...有没有办法移动它?
-
将此代码迁移到 SSE 不会由 IMO 的 CodeReview 处理。
-
在代码审查时,我们可以帮助您清理现有代码,但我们不会帮助您为/使用 SSE 重写它。
-
我也觉得这个问题被认为离题了。也许它看起来不够具体。我建议以更具体的方式重新制定它,例如“我使用整数的特殊字符串表示形式,我称之为 base4 数字(解释一下)。我想将 uint32_t 数字转换为这种表示形式,反之亦然,使用 SSE 操作.这里是当前标量代码供参考(代码)。不要忘记在您的问题中添加 simd 和 sse 标签。附:我知道二进制->字符串转换的有效解决方案。
标签: c++ optimization x86 bit-manipulation sse