32 ビットの符号なし整数形式 (例: 0xFF00FF) の RGB カラーが与えられた場合、ビットシフト操作を使用して個々のコンポーネントを抽出せずに、どのように反転 (負の色を取得) しますか?
ビット単位の演算 (AND、OR、XOR) だけを使用して可能かどうか疑問に思います。
より正確には、使用する命令数が最も少ないアルゴリズムは何ですか?
とてもシンプルだと思います。0xFFFFFF-YourColor を計算するだけです。反転色になります。
int neg = 0xFFFFFF - originalRGB
// optional: set alpha to 255:
int neg = (0xFFFFFF - originalRGB) | 0xFF000000;
色の否定を実行するだけです。スニペット:
~ color
あなたの質問は不明確です。RGB のどの色も「負の色」ではありません。
フィルムのネガであるかのように、イメージを反転できます。そうですか?
色が 1 ピクセルしかない画像を反転したい場合0xFF00FF
、白から を差し引く計算になります0xFFFFFF
。
> negative_result_color = 0xFFFFFF - 0xFF00FF
> negative_result_color == 0x00FF00
true
コンピューターでは、補数を追加することで減算が行われます: http://en.wikipedia.org/wiki/Method_of_complements#Binary_example
しかしまじめな話、普通のコードでマシンに引き算をさせてみませんか? それは彼らが得意なことです。
Color color_original = Color.lightGray;
int rgb = color_original.getRGB();
int inverted = (0x00FFFFFF - (rgb | 0xFF000000)) | (rgb & 0xFF000000);
Color color_inverted = new Color(inverted);