Mod Operator (% in C#)
基本上,它返回除法运算的剩余部分。例如,13 Mod 4 = 1,因为 13 / 4 = 3 w/余数为 1。了解 long 值是如何创建的,以了解函数为什么会这样做,这一点很重要。
所有颜色(红色、绿色、蓝色)都以 0-255 的数量表示。例如,想象以下值:R(8)、G(3)、B(1)。
要了解该函数为什么会这样做,让我们看一下数值范围为 0-9(10 个值)而不是 0-255(256 个值)的场景。您将如何表示可以对这些值进行逆向工程的单个值?您不能简单地将这些值相加 (8 + 3 + 1 = 12),因为不可能对原始值进行逆向工程。相反,您必须将值乘以基数。基数取决于值范围...在示例中为 10,因为有 10 个值。该位置是从零开始的索引。红色的位置是 0,绿色的位置是 1,蓝色的位置是 2。
Value * (Base^Position))
- 红色(8) = (8 * 10^0) = 8 * 1 = 8
- 绿色(3) = (3 * 10^1) = 3 * 10 = 30
- 蓝色(1) = (1 * 10^2) = 1 * 100 = 100
8 + 30 + 100 = 138。而且 138 可以很容易地被逆向工程(事实上,只要看看它!)。数学上的逆向工程是这样完成的:
(CombinedValue / (Base^Position)) % Base = OriginalValue
.
- (138 / (10^0)) % 10 = (138 / 1) % 10 = 138 % 10 = 8 (红色)
- (138 / (10^1)) % 10 = (138 / 10) % 10 = 13 (小数被截断) % 10 = 3 (绿色)
- (138 / (10^2)) % 10 = (138 / 100) %10 = 1(小数被截断)% 10 = 1(蓝色)
该函数做了几件事:
- 由于某种原因
(lColor And &HFF00)
,它无用地执行按位运算符。(lColor And &HFF0000)
- 它简化了数学。红色 (256^0 = 1) 除以 1 没有意义,使用模运算符检索绿色也没有意义,因为 X % 256 = X 对于 X < 256 的所有 X。此外,256^2等于 65536。
- 它使用可以表示颜色值的实际范围(0-255、256 个值)。
您实际上可以使用该函数的简化版本:
Private Function LongToRGB(lColor As Long) As String
Dim iRed As Long, iGreen As Long, iBlue As Long
iRed = lColor Mod 256
iGreen = (lColor / 256) Mod 256
iBlue = lColor / 65536
LongToRGB = Format$(iRed, "000") & ", " & Format$(iGreen, "000") & ", " & Format$(iBlue, "000")
End Function
请注意,最后一种方法只是一个字符串格式化函数,与数学无关。