Mod Operator (% in C#)
基本的に、除算の余りを返します。たとえば、13 Mod 4 = 1、つまり13/4 = 3、余りは1です。関数が何をするのかを理解するには、long値がどのように作成されるかを理解することが重要です。
すべての色(赤、緑、青)は0〜255の量で表されます。たとえば、次の値を想像してください:R(8)、G(3)、B(1)。
関数がその機能を実行する理由を理解するために、数値の範囲が0〜255(256値)ではなく0〜9(10値)のシナリオを見てみましょう。値をリバースエンジニアリングできる単一の値をどのように表現しますか?元の値をリバースエンジニアリングすることは不可能であるため、値を単純に合計することはできません(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進数は切り捨てられます)%10 = 3(緑)
- (138 /(10 ^ 2))%10 =(138/100)%10 = 1(10進数は切り捨てられます)%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
最後の方法は単なる文字列フォーマット関数であり、数学とは関係がないことに注意してください。