【发布时间】:2011-11-03 03:01:09
【问题描述】:
我正在尝试连接两个 uint32_t 并返回一个 uint64_t。这是我的方法
uint64_t concat_int1_int2 (uint32_t int1, uint32_t int2) {
uint64_t concatenated = int1;
return concatenated << 32 | int2;
}
这似乎非常慢(我需要做大约 1,000,000 次,大约需要 6 分钟)。两个问题,为什么位移需要这么长时间(这似乎是限制步骤),有没有人建议更快的方法来做到这一点?
【问题讨论】:
-
我的第一个猜测是你正在编译一个 32 位二进制文件,而编译器不能使用原生的“long”类型。仔细检查您的构建是否生成了 x64 可执行文件?
-
正如大卫所说,这是正确的方法 - 你使用的是什么硬件 - 是偶然的 32 位吗?
-
我们能看到调用代码,或者一些分析程序的输出吗?如果你正在做类似
for(int i = 0; i < 1000000; i++) printf("%" PRIu64, concat_int1_int2(int1, int2));的事情,那么我可以告诉你为什么需要 6 分钟... -
另外,如果您将它们命名为
high和low,而不是int1和int2,可能会更清楚。 -
我在 64 位机器上运行。评论了大卫关于为什么我认为转变是限制性步骤的回答。关于我的思路是否有效的任何问题?
标签: c