在一些与C / C ++图形相关的旧代码中,我必须移植到Java和JavaScript,我发现了这一点:
b = (b+1 + (b >> 8)) >> 8; // very fast
哪里b
是short int
蓝色,而相同的代码会被视作r
和b
(红色和蓝色)。该评论没有帮助。
除了明显的移动和添加之外,我无法弄清楚它的作用。我可以不加理解地移植,我只是出于好奇而问。
y = ( x + 1 + (x>>8) ) >> 8 // very fast
这是除以255的定点近似值。从概念上讲,这对于基于像素值的标准化计算非常有用,这样255(通常是最大像素值)就精确地映射到1。
它被描述为非常快,因为完全通用的整数除法在许多CPU上都是相对较慢的操作-尽管如果编译器可以推断出输入约束,则可能为您进行类似的优化。
这是基于257/(256*256)
非常近似的思想进行的1/255
,x*257/256
可以表示为x+(x>>8)
。将+1
被舍入支持,允许公式完全匹配整数除法x/255
的所有值x
在[0..65534]。
内部的一些代数可能会使情况变得更加清晰。
x*257/256
= (x*256+x)/256
= x + x/256
= x + (x>>8)
这里还有更多讨论:如何快速进行Alpha混合?在这里:通过乘法除法
顺便说一句,如果您想四舍五入,并且您的CPU可以进行快速乘法运算,则对于所有uint16_t分红值,以下内容都是准确的-实际为[0 ..(2 ^ 16)+126]。
y = ((x+128)*257)>>16 // divide by 255 with round-to-nearest for x in [0..65662]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句