2 つの符号付き 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
とは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);