- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在努力创建一个函数,它接受两个 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 语言对我来说一直是一门非常难的语言,位运算更是如此。
最佳答案
这可以根据interleaving bits来完成,但跳过了一些步骤,因此它只交错字节。同样的想法:首先分几步展开字节,然后组合它们。
这是计划,用我惊人的手绘技巧来说明:
在 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/
我正在寻找一个好的压缩算法或库,让我可以将多个压缩数据流交织成一个数据流,不会造成性能或压缩损失。 更多背景信息:我一直在研究一种专用于特定应用程序的压缩格式。这种压缩格式对数据执行一堆特定领域的分析
Google Mock documentation说: Important note: Google Mock requires expectations to be set before the m
我想交织(?)两个字符串,例如: string A = 'HELLO WORLD!' string B = '66666666666666666666' //twenty 6's output = '
我如何按列交织 numpy 矩阵。 给出这个例子: >>> import numpy as np >>> a = np.zeros((3,3)) >>> b = np.ones((3,3)) >>>
我正在尝试按照交错 GStreamer 文档中的说明交错两个音频文件: gst-launch interleave name=i ! audioconvert ! wavenc ! filesink
我有两个列表,保证第一个比第二个多一个项目。我想知道创建一个新列表的最 Pythonic 方法,该列表的偶数索引值来自第一个列表,奇数索引值来自第二个列表。 # example inputs list
我是一名优秀的程序员,十分优秀!