在OpenCL中左移负值

时间:2018-08-19 16:37:59

标签: opencl

我在互联网上发现了一些OpenCL代码,该代码将定点数字转换为浮点数时将值左移左数,即E1 << (-E2)代替E1 / (1 << E2)。我想知道这是否有效。 OpenCL 1.0标准说

  

E1 << E2的结果E1向左移log2(N)E2的最低有效位,被视为无符号整数值,其中N是用于表示标量数据类型或向量数据类型的每个分量的位数;空出的位用零填充。

据我所知,它是这样的(现在假设E2是负数):

int mask = -1ul >> (CHAR_BIT * sizeof(unsigned long) - (int)log2(CHAR_BIT * sizeof(E1)));
int result = E1 << (mask & (*(unsigned int*)&E2));

我理解正确吗?如果是这样,似乎E2即使是负数也只是被解释为无符号值,因此不可能左移负数,对吗?

另一个source

  

OpenCL C:移位计数取移位类型的位数

我理解为类似的东西

int result = E1 << (E2 % (CHAR_BIT * sizeof(E1)));

产生相同的结果。

那么,负迁移是否有可能导致预期的结果?

0 个答案:

没有答案