C++ 使用整数和移位模拟浮点运算

C++ 使用整数和移位模拟浮点运算,c++,bit-manipulation,C++,Bit Manipulation,我的问题是我目前正在开发的C++框架中的范围效率。上下文:我有两个大小相等的数组。其中一个包含检测到的点云的点坐标,另一个包含相应的颜色值。出现的问题是,颜色值索引与点坐标不完全匹配,因此需要缩放颜色数组 为了保持系统的效率,有人建议我使用以下“hack”来避免浮点操作,以使移位的_row_索引比x运行得慢,从而缩放颜色数组索引。不幸的是,顾问目前不可用,我不明白为什么这种解决方案在这种情况下有效 如果有人能给我解释一下,你会很好的。提前谢谢 int shifted_row_index = (R

我的问题是我目前正在开发的C++框架中的范围效率。上下文:我有两个大小相等的数组。其中一个包含检测到的点云的点坐标,另一个包含相应的颜色值。出现的问题是,颜色值索引与点坐标不完全匹配,因此需要缩放颜色数组

为了保持系统的效率,有人建议我使用以下“hack”来避免浮点操作,以使移位的_row_索引比x运行得慢,从而缩放颜色数组索引。不幸的是,顾问目前不可用,我不明白为什么这种解决方案在这种情况下有效

如果有人能给我解释一下,你会很好的。提前谢谢

int shifted_row_index = (RGB_OFFSET_X << 8);
for (int x = 0, xmax = g_depthMD.XRes(); x < xmax; x += raster_width)
{
     shifted_row_index += RGB_SCALE_FACTOR_X;
     int rowindex = shifted_row_index >> 8;
     rowindex = std::max(std::min(rowindex, (int)(xmax - 1)), 0);
     color_pointer[0] = pImageRow[rowindex].nRed;
     //....
}
int-shifted\u row\u index=(RGB\u OFFSET\ux>8;
rowindex=std::max(std::min(rowindex,(int)(xmax-1)),0);
颜色指针[0]=pImageRow[rowindex].nRed;
//....
}
我看到的唯一“比特黑客”操作是左移位和右移位操作。我认为没有理由使用它们,因为任何合理的编译器都会优化代码:

int shifted_row_index = (RGB_OFFSET_X * 64);


同样有效。

不清楚这段代码的目的是什么,因此很难解释它是如何实现其目标的…@Oli:我认为
RGB_SCALE_FACTOR_X
小于256(或者说不是倍数),而这段代码的重要目的就是实际上增加了一些小于1的值(或无论如何不是整数)到每次迭代的运行总计。因此,运行总计是
移位的行索引/256
,已进行针孔优化。要使有符号除法与右移除法一样高效,您需要一条与移位指令一样快的除法指令(不太可能),否则您需要以某种方式免费确定输入值是非负的。我认为“任何合理的编译器”可以做到这一点,但它至少可以获得相当接近相同的性能。因此,您可能会质疑是否应该对索引进行签名。我认为当前的大多数编译器都将简单地用位移位替换乘法,我认为我已经进行了几次基准测试,以验证这两个版本是否同样优化。@IvayloStrandjev:乘法是的,除法很棘手,因为
-1/2
是0,而不是-1(从C++11开始需要,但在大多数实现向0取整之前)。如果
RGB\u OFFSET\u X
是一个编译时常数,那么乘法可能根本不会出现在发出的代码中。@SteveJessop您能举一个例子,当执行
shift\u row\u index/64时;
明显比
shift\u row\u index>>8;
int rowindex = shifted_row_index / 64;