2 の補数表現を用いたハック

方法

 あともう一文字削除したい!という時に使える(かもしれない)テクニックです。 少なくとも Python モードにおける Processing では、

background(255)
fill(246)

background(-1)
fill(-9)

と書けます。

この方法は background や fill だけでなく、stroke 関数など、 色を指定するところで使用できます。

 また、アルファ値(不透明度)も、あわせて設定する場合でも使用可能です:

fill(255,10) # α=10 の白で塗りつぶす

fill(-1,10)

と記述できます。

原理

 なぜこのように記述できるのかというと、 おそらく、Python モードの Processing においては、 background や fill 関数の引数は結果として符号なし整数として 取り扱われているからだと思います。

 255 は 2 進数で表すと、 11111111 と 8 桁すべてが 1 の値となります。

一方、-1 を 2 の補数表現を用いて n ビットの 2 進数(n 桁の 2 進数)で表すと n 桁全てが 1 となります。

 background 関数や fill 関数に、0 から 255 以外の値、 つまり負の値や 255 より大きな 1000 とか 65535 といった大きな値を 与えてもエラーにはなりません。

これは一体どういうことなのでしょうか。

ざっと Python モードの Processing のソースコードをみてみたのですが、 引数が 1 つの場合、 ARGB がそれぞれ 8 ビットの 32 ビット整数として取り扱われるようです。

そのため、-1 は RGB および α(=A) に 255 を指定したものとして解釈されます。 ちなみに、-1 ではなく、-9 を与えると (A,R,G,B)=(255,255,255,246) を与えたこととなり、 少し黄色がかった色になります。

まとめ

 この文章では、色指定のところで白色や RGBA の各成分で 255 を使う場合に 1 文字減らせるテクニックを紹介しました。 少し考えてみると分かると思いますが、これは 255 という値に限らず、 -9 まで使うことを考えると、 246〜255 までの値について使えるテクニックです。

その理由についても、2 進数の表現形式をもとに推察してみました。

 この文章のテクニックを使うと、1 文字減らすことができますので、 あと 1 文字あれば、つぶやき Porcessing できるのに…という人は、 試してみていただければ幸いです。