gpt4 book ai didi

c - (r+1 + (r >> 8)) >> 8 是做什么的?

转载 作者:太空狗 更新时间:2023-10-29 17:27:34 24 4
gpt4 key购买 nike

在一些旧的 C/C++ 图形相关代码中,我必须移植到 Java 和 JavaScript,我发现了这个:

b = (b+1 + (b >> 8)) >> 8; // very fast

b 是蓝色的 short intrb 的代码相同(红色& 蓝色的)。评论没有帮助。

除了明显的移动和添加之外,我无法弄清楚它的作用。我可以在不理解的情况下移植,我只是出于好奇而问。

最佳答案

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)

这里有更多的讨论:How to do alpha blend fast?在这里:Division via Multiplication


顺便说一句,如果你想要舍入到最近,并且你的 CPU 可以进行快速乘法运算,那么以下对于所有 uint16_t 股息值都是准确的——实际上是 [0..(2^16)+126]。

y = ((x+128)*257)>>16 // divide by 255 with round-to-nearest for x in [0..65662]

关于c - (r+1 + (r >> 8)) >> 8 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30237567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com