EJPが指摘したように、マスクは、カラーコンポーネント/チャネル(赤、緑、青)の1つの値を除外するために使用されます。そして、それは通常、ビットシフト/マスキング操作で行うことです。あなたが得る値であなたがする他のすべては算術またはより高度な数学です。
カラーチャネルの範囲は0〜255、または16進値で0x00〜0xFFです。それを再構築するには、コンポーネントの値を元の場所にビットシフトする必要があります。これは、単純な算術加算と組み合わせることができます。
// Example values
int r = 255; // 0xFF
int g = 1; // 0x01
int b = 15; // 0x0F
// go back to original form:
// A R G B
int color = r << 16; // 0x00.FF.00.00
color += g << 8; // 0x00.FF.01.00
color += b; // 0x00.FF.01.0F
// just add back the alpha if it is going to be full on
color = += 255 << 24; // 0xFF.FF.01.0F
色間で補間を行う場合は、すべての色を1つの整数にまとめるのではなく、各色コンポーネントに対して個別に行う必要があります。場合によっては、表現を[0-255]から10進数の[0.0f-1.0f]に変更することもお勧めします。
// Darken red value by 50%
int color = ...; // some color input
int mask = 0xFF;
int a = (color >> 24) & mask;
int r = (color >> 16) & mask;
int g = (color >> 8) & mask;
int b = color & mask;
// convert to decimal form:
float rDecimal = r / 255f;
// Let r: 0x66 = 102 => rDecimal: 0.4
// darken with 50%, basically divide it by two
rDecimal = r/2;
// rDecimal: 0.2
// Go back to original representation and put it back to r
r = (int)(rDecimal * 255);
// r: 51 = 0x33
// Put it all back in place
color = (a << 24) + (r << 16) + (g << 8) + b;
これがお役に立てば幸いです。