【发布时间】:2019-02-12 05:30:33
【问题描述】:
我目前正在创建一个函数,它接受两个 4 字节无符号整数,并返回一个 8 字节无符号长整数。我试图以this research 描述的方法为基础,但我所有的尝试都没有成功。我正在使用的具体输入是:0x12345678 和0xdeadbeef,我正在寻找的结果是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 对我来说是一门非常困难的语言,按位运算更是如此。
【问题讨论】:
-
相关,看看为什么你不接受你平台上的
std::cout << sizeof(unsigned long)可能是有教育意义的。为什么你已经在使用uint64_t而不使用uint32_t有点奇怪。 -
你需要使用
%lx来打印一个无符号长整数。 -
您的
i值不是正确的掩码。并且您的移位量需要以 8 位为单位递减。 -
将内联汇编与
PSHUFB或其等效的内在函数一起使用:(V)PSHUFB: __m128i _mm_shuffle_epi8 (__m128i a, __m128i b)。 -
result没有初始值。如果你是oring 东西,你需要先确保它是空的。 (result = 0;)
标签: c bit-manipulation interleave