所以这是代码:
int thread = blockIdx.x * blockDim.x + threadIdx.x + 0xeafe7436;
uchar m[12];
uint res[4];
m[0] = (uchar)(thread & 0x000000ff);
m[1] = (uchar)((thread >> 8) & 0x000000ff);
m[2] = (uchar)((thread >> 16) & 0x000000ff);
m[3] = (uchar)((thread >> 24) & 0x000000ff);
for (unsigned long long i = 0; i < 0xffffffffffffffff; i++) {
m[4] = (uchar)(i & 0x00000000000000ff);
m[5] = (uchar)((i >> 8) & 0x00000000000000ff);
m[6] = (uchar)((i >> 16) & 0x00000000000000ff);
m[7] = (uchar)((i >> 24) & 0x00000000000000ff);
m[8] = (uchar)((i >> 32) & 0x00000000000000ff);
m[9] = (uchar)((i >> 40) & 0x00000000000000ff);
m[10] = (uchar)((i >> 48) & 0x00000000000000ff);
m[11] = (uchar)((i >> 56) & 0x00000000000000ff);
md5(m, 12, res);
}
我认为移位和按位运算使我的代码比应有的速度慢,所以我想尝试使用
memcpy
看看是否更快。
我想将
i
的值复制到 m
,从索引 4 开始。我该如何使用 memcpy
来执行此操作?我研究了其他问题,但发现它们令人困惑且难以理解,并且我自己无法做到。
编辑:我已经在其他代码的上下文中测试了上面的代码,它很快。但我想使用 memcpy 来测试它的速度。因此,我不想单独设置字节数组
m
的每个字节,而是想使用 memcpy 在一次操作中完成此操作。因此,将 i
的值复制到 m
,以便 m 的每个字节(从索引 4 到 11)对应于 i 中的一个字节。 i
是一个unsigned long long,有8个字节。因此,将每个字节从 i
复制到 m
,以便 m[4] = i 的第一个字节,m[5] = i 的第二个字节等等。我认为这个目标的措辞非常好。
你想太多了。了解 unsigned long long 和字节数组本质上只是内存位置。您想要/需要做的就是将数据从一个复制到另一个。然后可能会发现字节顺序问题。
int main()
{
unsigned long long value = 0x123456789ABCDEF0;
uint8_t byteArray[sizeof(unsigned long long)];
std::memcpy(byteArray, &value, sizeof(value));
// This will reverse the byte order to match the original endianness
// Discard if not needed.
// If you're using C or C++ older than 17, you'll need to byte swap with a
// for loop
std::reverse(byteArray, byteArray + sizeof(byteArray));
std::cout << "Array: ";
for (size_t i = 0; i < sizeof(byteArray); ++i)
{
std::cout << std::hex << static_cast<int>(byteArray[i]) << " ";
}
return 0;
}