gpt4 book ai didi

c - 将 4 字节 int 交织到 8 字节 int

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:59 27 4
gpt4 key购买 nike

我目前正在努力创建一个函数,它接受两个 4 字节无符号整数,并返回一个 8 字节无符号长整数。我试图将我的工作基于 this research 描述的方法,但我的所有尝试都没有成功。我正在处理的具体输入是:0x123456780xdeadbeef,我要查找的结果是 0x12de34ad56be78ef。这是我到目前为止的工作:

unsigned long interleave(uint32_t x, uint32_t y){
uint64_t result = 0;
int shift = 33;

for(int i = 64; i > 0; i-=16){
shift -= 8;
//printf("%d\n", i);
//printf("%d\n", shift);
result |= (x & i) << shift;
result |= (y & i) << (shift-1);
}
}

但是,此函数不断返回不正确的 0xfffffffe。我正在使用以下方法打印和验证这些值:

printf("0x%x\n", z);

然后输入像这样初始化:

uint32_t x = 0x12345678;
uint32_t y = 0xdeadbeef;

如能就此主题提供任何帮助,我们将不胜感激,C 语言对我来说一直是一门非常难的语言,位运算更是如此。

最佳答案

这可以根据interleaving bits来完成,但跳过了一些步骤,因此它只交错字节。同样的想法:首先分几步展开字节,然后组合它们。

这是计划,用我惊人的手绘技巧来说明:

permutation

在 C 中(未测试):

// step 1, moving the top two bytes
uint64_t a = (((uint64_t)x & 0xFFFF0000) << 16) | (x & 0xFFFF);
// step 2, moving bytes 2 and 6
a = ((a & 0x00FF000000FF0000) << 8) | (a & 0x000000FF000000FF);
// same thing with y
uint64_t b = (((uint64_t)y & 0xFFFF0000) << 16) | (y & 0xFFFF);
b = ((b & 0x00FF000000FF0000) << 8) | (b & 0x000000FF000000FF);
// merge them
uint64_t result = (a << 8) | b;

已建议使用 SSSE3 PSHUFB,它可以工作,但有一条指令可以一次性执行逐字节交错,punpcklbw .所以我们真正需要做的就是将值传入和传出 vector 寄存器,然后这条指令就会处理它。

未测试:

uint64_t interleave(uint32_t x, uint32_t y) {
__m128i xvec = _mm_cvtsi32_si128(x);
__m128i yvec = _mm_cvtsi32_si128(y);
__m128i interleaved = _mm_unpacklo_epi8(yvec, xvec);
return _mm_cvtsi128_si64(interleaved);
}

关于c - 将 4 字节 int 交织到 8 字节 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212750/

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