gpt4 book ai didi

c++ - 有没有一种更快的方法来按位连接两个整数?

转载 作者:行者123 更新时间:2023-12-02 10:26:38 25 4
gpt4 key购买 nike

对于我的C++程序,我想将两个32位无符号整数按位连接为一个64位无符号整数。曾多次问过类似的问题,答案大多与此相似:

#include <cstdint>
#include <iostream>

int main()
{
std::uint32_t leftHalf = 1;
std::uint32_t rightHalf = 2;

std::uint64_t concatenated = ((std::uint64_t) leftHalf << 32) | secondHalf;

std::cout << "left=" << leftHalf << " and right=" << rightHalf << " concatenated into " << concatenated << std::endl;
}
Try it online
由于我必须在程序中执行很多串联,因此我需要它非常有效。使用强制转换,移位和按位|,似乎另一种技术(例如使用memcpy)可能会更快。
有没有比使用强制转换,移位和按位|来连接两个整数更快的方法?
为了完整起见,我未编译的方法是:
#include <cstdint>
#include <iostream>

int main()
{
std::uint32_t leftHalf = 1;
std::uint32_t rightHalf = 2;

std::uint64_t concatenated;

std::uint32_t *halfIt = &concatenated;

*halfIt = leftHalf;
++halfIt;
*halfIt = rightHalf;

std::cout << "left=" << leftHalf << " and right=" << rightHalf << " concatenated into " << concatenated << std::endl;
}

最佳答案

如果找到了一种将值的一部分(以位集形式)复制到另一个值的一部分(以位集形式)的有效方法,则可以进一步提高速度。但是我想这会有点骇人听闻。
顺便说一下,在下面的代码中,功能concat1是一个在编译后的代码中比concat2短的命令。

#include <iostream>
using namespace std;

std::uint64_t concat1(const std::uint32_t& leftHalf, const std::uint32_t& rightHalf){
std::uint64_t concatenated = leftHalf;
concatenated <<= 32;
concatenated |= rightHalf;

return concatenated;
}

std::uint64_t concat2(const std::uint32_t& leftHalf, const std::uint32_t& rightHalf){
std::uint64_t concatenated = (static_cast<std::uint64_t>(leftHalf) << 32) | rightHalf;

return concatenated;
}

int main() {
cout << concat1(1,2) <<std::endl;
cout << concat2(1,2) <<std::endl;
}
您可以在例如 https://godbolt.org/。函数 concat1mov少执行一次 concat2操作。但是差异将很小。我估计约占运行时间的5%;
concat1(unsigned int const&, unsigned int const&):
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-24], rdi
mov QWORD PTR [rbp-32], rsi
mov rax, QWORD PTR [rbp-24]
mov eax, DWORD PTR [rax]
mov eax, eax
mov QWORD PTR [rbp-8], rax
sal QWORD PTR [rbp-8], 32
mov rax, QWORD PTR [rbp-32]
mov eax, DWORD PTR [rax]
mov eax, eax
or QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
pop rbp
ret
concat2(unsigned int const&, unsigned int const&):
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-24], rdi
mov QWORD PTR [rbp-32], rsi
mov rax, QWORD PTR [rbp-24]
mov eax, DWORD PTR [rax]
mov eax, eax
sal rax, 32
mov rdx, rax
mov rax, QWORD PTR [rbp-32]
mov eax, DWORD PTR [rax]
mov eax, eax
or rax, rdx
mov QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
pop rbp
ret

关于c++ - 有没有一种更快的方法来按位连接两个整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64233711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com