我在互联网上发现了一些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)));
产生相同的结果。
那么,负迁移是否有可能导致预期的结果?