我想将两个带符号的 16 位整数打包/解包成一个 32 位整数。但是,我并没有让它完全正常工作。
关于我可能做错了什么的任何想法?
template <typename T>
int read_s16(T& arr, int idx) restrict(amp)
{
return static_cast<int>((arr[idx/2] >> ((idx % 2) * 16)) << 16) >> 16;
}
template<typename T>
void write_s16(T& arr, int idx, int val) restrict(amp)
{
// NOTE: arr is zero initialized
concurrency::atomic_fetch_or(&arr[idx/2], (static_cast<unsigned int>(val) & 0xFFFF) << ((idx % 2) * 16));
}
函数返回/参数必须是我定义的。lo
and是从不同的线程写入的hi
(因此是 atomic_or),并且读取必须返回单个 32 位值。
目标平台不支持 16 位整数运算。
例子:
array<int> ar(1); // Container
write_s16(ar, 0, -16);
write_s16(ar, 1, 5);
assert(read_s16(ar, 0) == -16);
assert(read_s16(ar, 1) == 5);