1

我有 16 个索引,从 0 到 255(每个 8 位)存储在一个大的 uint4 中,另一个存储在 ulong[2] 中。

如何转换它们,以便我可以访问它们各自的 8 位 (uchar) 值?

现在我正在为 uint4 进行这样的转换:

index1 =  myUint4Val.s0       & 0xff;  
index2 = (myUint4Val.s0 >>8)  & 0xff;
...
index16 =(myUint4Val.s3 >>24) & 0xff;

然后我可以像这样使用它们:

value = dataAt[index1]; ....

我宁愿不使用那些>>, & 0xff,因为这些是我希望避免的额外操作。

相反,以uchar8.s0.. 访问它们uchar8.s7似乎没问题,

但我坚持将类型转换为我想要的类型......

4

2 回答 2

1

在 OpenCL 中有重新解释函数as_*()

例如,

uint16 a = as_uint16(myUint4Val); // now you can use a.s0, a.s01, a.s2 etc
uint16 b = as_uint16(myUint8Val);
于 2017-11-03T19:48:15.720 回答
0

您可以获取您的地址myUint4Val,将结果指针转换为uchar*并将其视为 uchar 变量数组:

uchar* index_array = (uchar*)&myUint4Val;

value = dataAt[index_array[0]];
value = dataAt[index_array[1]];

或者,您可以执行 C-Style reinterpret-cast 构造,它告诉编译器将您的内存myUint4Val视为其他类型(请注意此处的类型大小)。要将前 8 个索引放入 a uchar8,您可以尝试以下操作,它会创建正确类型的副本。它基本上通过 获取地址&,将指针类型更改为所需的uchar8*指针类型,并将指针取消引用到uchar8值类型。

uchar8 index = *((uchar8*)&myUint4Val); // takes first 8 byte
value = dataAt[index.s0];

或者,您可以只创建一个正确类型的指针:

uchar8* index = (uchar8*)&myUint4Val;
value = dataAt[(*index).s0];

注意:我没有机会对此进行测试,但我希望总体思路有所帮助。

于 2017-11-03T16:18:31.327 回答