我想创建一个将char数组转换为double的函数。我将在我的内核中调用此函数并将指针传递给char数组。但它似乎有问题。我不能在双重
中使用位操作double toDouble(uchar* ptr)
{
double value;
value = *ptr << 56;
value |= *(ptr+1) << 48;
value |= *(ptr+2) << 40;
value |= *(ptr+3) << 32;
value |= *(ptr+4) << 24;
value |= *(ptr+5) << 16;
value |= *(ptr+6) << 8;
value |= *(ptr+7);
return value;
}
这给出了1个错误&#34;无效操作数到二进制表达式(&#39; double&#39;和&#39; double&#39;)&#34;
这也给了我一个警告&#34;班次计数&gt; =类型&#34;的宽度。
但是当我用int或long做同样的事情时(创建一个类似的函数toInt并使用位操作),我没有得到任何错误。这是将uchar数组转换为double的正确方法吗?
我也试过这个
double data;
uchar* dataptr=&data;
for(int i=0;i<8;i++)
dataptr[i]=ptr[i]; //where ptr is the pointer to the uchar array
但是这给了我一个错误&#34;在具有不同地址空间的两个指针之间的非法隐式转换&#34;
答案 0 :(得分:2)
大多数OpenCL遵循C99标准,但硬件供应商支持浮点值和一些奇怪之处。
考虑到这一点,让我们看一下按位运算符的C99标准: &#34;按位运算符仅适用于有限类型:int和char(以及int的变体)。你可以通过一些演员使其适用于其他类型。这些运算符与bitshift运算符一起允许您访问和修改位。&#34; http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/bitwise.html
那么,这是什么意思?您需要对能够按位运算符的类型执行操作。您还需要确保它具有相同的位大小。所以,看看双倍,是一个64位的值。我们可以在long上使用按位运算符,类型为int的变量,它是64位。这样做之后,你需要做一个长到两倍的演员,然后你可以返回你的价值。所以你的代码看起来像这样:
long value;
value = *(ptr) << 56;
value |= *(ptr+1) << 48;
value |= *(ptr+2) << 40;
value |= *(ptr+3) << 32;
value |= *(ptr+4) << 24;
value |= *(ptr+5) << 16;
value |= *(ptr+6) << 8;
value |= *(ptr+7);
double value2 = (double)value;
这很好用。但是您需要检查您的OpenCL版本如何投射值。这是一个让你入门的参考。 OpenCL 1.2在较新的AMD显卡中很常见,但如果您有NVIDIA显卡,我会看一下1.1规格:https://www.khronos.org/registry/cl/specs/opencl-1.2.pdf