我有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
访问它们似乎没问题,
但我仍然坚持将类型转换为我想要的类型......
答案 0 :(得分:1)
在OpenCL中有重新解释函数as_*()
例如,
uint16 a = as_uint16(myUint4Val); // now you can use a.s0, a.s01, a.s2 etc
uint16 b = as_uint16(myUint8Val);
答案 1 :(得分:0)
您可以获取myUint4Val
的地址,将结果指针强制转换为uchar*
并将其视为uchar变量数组:
uchar* index_array = (uchar*)&myUint4Val;
value = dataAt[index_array[0]];
value = dataAt[index_array[1]];
或者你可以做一个C-Style重新解释 - 转换构造,它告诉编译器将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];
注意:我没有机会对此进行测试,但我希望这个概念有所帮助。