DTPab

DTPにまつわるあれこれ

TrueとFalseのトグル

【追記】したたか企画さんからのリプライを追記しました。ありがとうございます。

やりたいこと

字形パネルをショートカットで閉じたり開いたりしたいのですが、デュアルモニターだとメインでないデスクトップにある字形パネルがうまく開閉できないのです。そこでスクリプトで開閉させてやろうと思いました。
要するにPanel.visibleをトグルさせたいわけです。

正攻法のif文

if (app.panels.itemByName("字形").visible){
    app.panels.itemByName("字形").visible = false;
    }
else app.panels.itemByName("字形").visible = true;

なのですが、ご覧の通り、ちょっと(いやかなり)ダサい。

三項演算子

今度は三項演算子を使って書き直します。

var jikei = app.panels.itemByName("字形");
(jikei.visible)? jikei.visible=false: jikei.visible=true;

多少はマシになりました?
それでも変数を使わないとかなり冗長になります。
それに何度も同じものを書くというのは「僕の美学に反します」。

XOR演算子

これをXOR演算子^を使って書いてみます。

app.panels.itemByName("字形").visible ^= 1;

超すっきりですね。
このやり方は少し前に@AJABON先生に教わりました。

XOR演算子とは

XOR演算子を含めたビット演算子について、詳細は以下を参照。

developer.mozilla.org

ここからXOR演算子についての説明を抜粋すると、

a XOR b は、abが異なる場合に 1 を出力します

ということで、先程のコードではPanel.visible1を比較し、前者がtrueなら式は1 ^ 1の評価となり0が返ります。逆に前者がfalseなら0 ^ 1となり、1が返るわけです*1

ビット演算子利用時の注意点

ビット演算子を利用する場合は、最大32ビットになるので-2147483648〜2147483647までの数値しか比較できません*2

オペランドは 32 ビット整数に変換され、ビット列(0 と 1)として表現されます。32 ビットを超える数値は、最上位のビットが破棄されます。例えば以下の 32 ビットを超える数値は、32 ビット整数値に変換されます

変換前: 11100110111110100000000000000110000000000001
変換後:             10100000000000000110000000000001

ということのようです。


以上、XOR演算子を使った真偽値のトグルでした。

否定演算子

したたか企画先生からリプライをいただきました。

否定演算子なら三項演算子ほどくどくなく、スッキリ書けました。いつもありがとうございます!

*1:式で評価されるtrueは1、falseは0になります。

*2:2の32乗=4294967296個の数値を扱えて、0を起点に正の数2147483647個までと、負の数2147483648まで。