Types OpenCL:如何从uint4(或ulong[2])访问每个16个uchar值?

Types OpenCL:如何从uint4(或ulong[2])访问每个16个uchar值?,types,opencl,uint,ulong,Types,Opencl,Uint,Ulong,我有16个从0到255(每个8位)的索引存储在一个大uint4中,另一个存储在一个ulong中[2] 如何转换它们,以便访问它们各自的8位(uchar)值 现在我正在为uint4进行这样的转换: index1 = myUint4Val.s0 & 0xff; index2 = (myUint4Val.s0 >>8) & 0xff; ... index16 =(myUint4Val.s3 >>24) & 0xff; 然后我可以像这

我有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,似乎没问题


但是我在将类型转换为我想要的类型方面遇到了困难…

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

uchar* index_array = (uchar*)&myUint4Val;

value = dataAt[index_array[0]];
value = dataAt[index_array[1]];
或者,您可以执行C风格的重新解释强制转换构造,它告诉编译器将
myUint4Val
的内存视为其他类型(请注意此处的类型大小)。要将前8个索引放入
uchar8
,可以尝试以下方法,创建正确类型的副本。它基本上通过
&
获取地址,将指针类型更改为所需的
uchar8*
指针类型,并将指针取消引用为
uchar8
值类型

uchar8 index = *((uchar8*)&myUint4Val); // takes first 8 byte
value = dataAt[index.s0];
或者,您可以只创建一个正确键入的指针:

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

注意:我没有机会测试这一点,但我希望总体思路能有所帮助。

在OpenCL中,函数
被重新解释为*()

比如说,

uint16 a = as_uint16(myUint4Val); // now you can use a.s0, a.s01, a.s2 etc
uint16 b = as_uint16(myUint8Val);

我不认为我们可以像C那样做,因为当我看到openCL中的代码时,我从未见过如此简单的转换数据类型的方法。谢谢你的信息