【发布时间】:2014-06-21 14:41:37
【问题描述】:
为了在我的 C# 项目中重新计算位图图像中的像素,我想将我的 RGB 值四舍五入到 255 或向下舍入到 0;
每个值都是一个字节。
现在我正在做以下事情:
(byte)(Pixels[i] < 128 ? 0 : 255);
我确信这可以更快地实现,并且无需使用按位操作进行类型转换。我该怎么做呢?
【问题讨论】:
-
嗯,只有 256 个。将它们以二进制形式列出,然后观察是否存在小于 128 的特征与大于 127 的特征不同的特征。然后使用该功能。
-
嗯,改成整数,右移 7 位,得到 0 或 1。取反,得到 0 或 -1。转换回字节,可以吗?避免分支,但实际上可能会更慢。
-
这是一个合理的问题。三元语句构成条件分支,这会损害超标量处理器中的指令级并行性。
-
您已将问题更改为现在要求更快解决方案。请记住,如果不在您的实际硬件上尝试,就无法回答性能问题,请记住您需要优化最慢的东西 - 这可能不是它 - 还要记住你不想要更快的解决方案,你想要 足够快 的解决方案。设定一个目标,然后检查你是否达到了目标。如果您实现了目标,去海滩,这是美好的一天。不要浪费时间让已经足够快的代码更快。
-
@EricLippert:去海滩?这应该比摆弄比特更令人着迷吗?
标签: c# bit-manipulation rounding