Hidemaru Q and A

第III部〜秀丸マクロのいろはにほへと
 ビット演算を極める(仮題)


●ビット演算を極める

【0】ここに書いてあること
【1】はじめに − 秀丸で使えるビット演算子
【2】2進数、16進数とは
【3】秀丸マクロでの16進数の記述方法
【4】ビット演算の概念
【5】ビット演算の詳細
【6】ビット演算でできること
【7】秀丸マクロでの使用例 ※この項はまだ執筆中です。m(_ _)m

【0】ここに書いてあること

秀丸エディタのマクロの中でも、応用的な機能の中には、2進数の概念やビット演算を使用する必要がある部分があります。
例えば、

C言語など、他の言語でこれらの概念や演算子を理解されている方はまだしも、初めての方はとっつきにくい部分もあるかと思います。

この章では、ビット演算のしくみと秀丸マクロでの使い方について説明します。

【1】はじめに − 秀丸で使えるビット演算子

秀丸で使えるビット演算子は以下の3種類があります。

&ビット毎のAND
|ビット毎のOR
^ビット毎のXOR
と言われて、分かった、という方は、以下の説明は多分必要ないでしょう。「ANDってどういうこと?」「ビット毎って何?」と思われる方もいらっしゃることと思います。

[補足]
^ は、BASIC系の言語では、べき乗計算の演算子です。間違えないようにしましょう。

ビット演算のしくみを説明するにあたって、まず関連の深い「2進数」「16進数」について説明します。その後、ビット演算子の意味と使い方について説明していきます。

【2】2進数、16進数とは

10進数とは、0〜9の数字を1桁として表す数値の表現方法を指します。
同様に考えれば、2進数とは、0〜1の数字を1桁として表す数値の表現です。

2進数は、一般にコンピュータで数値を表す時の基本となる表記方法です。スイッチの ON と OFF をそれぞれ 1と0に見立て、そのスイッチを複数集めることで、大きな値の桁も表します。

[例] 10進数、2進数、16進数の対応表

10進数2進数16進数
10
11
100
101
110
111
1000
1001
101010
151111
161000010

10進数では、1の桁、10の桁、100の桁、・・・と続きますが、言い換えると、1の0乗の桁、10の1乗の桁、10の2乗の桁、・・・となります。
2進数では、2の0乗の桁、2の1乗の桁、2の2乗の桁、・・・と続きます。

2進数4桁(10進数でいえば0〜15)を1桁にまとめた数字の表現が16進数になります。

[補足]
「2進数・10進数」という表記について
秀丸エディタヘルプに限らず、計算機関係の文献でこのような用語がよく出ますが、厳密には、数自体にこうした種別が有るわけではありません。
正しくは「二進(法によって)表記した数」などとすべきものですが、ここでは便宜上、この表記を使って説明させてもらうことにします。

【3】秀丸マクロでの16進数の記述方法

秀丸マクロでは、2進数を直接記述する方法は有りませんので、10進数か16進数のどちらかの表記を使うことになります。

秀丸マクロ(および一般にC言語)では、16進数の数字には、頭に 0x という文字を付け、10進数でいう10〜15の数値をあらわす文字として、A〜Fを割り当てます。
(半角文字を使用。大文字でも小文字でも変わりません)

[例]

10進数で11の値を秀丸マクロ内で16進数で記述し、変数に代入する

#a = 0x0b;

[補足]
もちろん、これは以下のように書くのと同じ意味です。

#a = 11;

秀丸の側から見ると、どちらの方法で記述しても値としては同じであるため、結果は変わりません。
逆にいえば、16進数表記は、ビット演算を行う場合に、コードを書く側の人間が、コードが理解しやすくなって便利な記述方法であるとも言えます。

ビットとは、2進数ではその1桁に相当します。
2進数8桁(16進数2桁)の単位をバイトといい、10進数では0〜255の範囲を表すことができます。

[補足]
一般には、最上位ビットをマイナス符号と考えて、値の表す範囲を変える、符号付き表記も有ります。
秀丸マクロの場合、数値と数値変数の表記は、4バイト(32ビット)の符号付き整数になります。1バイトや2バイト分の表記だと、符号無しと同様になります。

【4】ビット演算の概念

次にビット演算の概念を説明します。

AND、OR、XORは、それぞれ以下の演算を行います。

[補足]
AND、OR、XORという名前の演算子は秀丸マクロには有りません。ここでは、演算の概念の説明のためにこの表記を使っています。

AND

両方とも1の場合だけ結果として1が返り、その他の場合は0になります。

1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0

OR

少なくともどちらかが1の場合に結果として1が返り、両方とも0の場合は0になります。

1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0

XOR

両方のビットが異なる場合にだけ結果として1が返り、その他の場合は0になります。

1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0

では、実際に秀丸マクロのビット演算子を使って確認してみましょう。
以下のマクロを実行して、ダイアログに表示される演算結果を見てください。

#a = 1 & 1;
#b = 1 & 0;
#c = 0 & 1;
#d = 0 & 0;

message "1 AND 1 = " + str(#a);
message "1 AND 0 = " + str(#b);
message "0 AND 1 = " + str(#c);
message "0 AND 0 = " + str(#d);

#e = 1 | 1;
#f = 1 | 0;
#g = 0 | 1;
#h = 0 | 0;


message "1 OR 1 = " + str(#e);
message "1 OR 0 = " + str(#f);
message "0 OR 1 = " + str(#g);
message "0 OR 0 = " + str(#h);


#i = 1 ^ 1;
#j = 1 ^ 0;
#k = 0 ^ 1;
#l = 0 ^ 0;


message "1 XOR 1 = " + str(#i);
message "1 XOR 0 = " + str(#j);
message "0 XOR 1 = " + str(#k);
message "0 XOR 0 = " + str(#l);

【5】ビット演算の詳細

冒頭で、 &, | , ^ は「ビット毎の」と書きましたが、複数ビットからなる値同士を計算すると、ビット毎に演算が行われます。いくつか例を見てみましょう。

[例]

2進数16進数10進数
10110110B6182
AND)1000100088136

1000000080128

2進数16進数10進数
10110110B6182
OR)1000100088136

10111110BE190

2進数16進数10進数
10110110B6182
XOR)1000100088136

001111103E62

これを実際に秀丸マクロで記述すると以下のようになります。

#a = 0xb6 & 0x88;
#b = 0xb6 | 0x88;
#c = 0xb6 ^ 0x88;

message "0xb6 AND 0x88 = " + str(#a);
message "0xb6 OR 0x88 = " + str(#b);
message "0xb6 XOR 0x88 = " + str(#c);

【6】ビット演算でできること

これらの演算子を使って何ができるか。
これらの演算子を利用して、秀丸マクロの中では、16進数の値(文字コード等)の分類ができたり、フラグの値として使用される値の一部ビットを操作したりできます。

AND演算を使うと、マスキング(=任意のビットを0にした値を出力)ができます。
0にしたいビットを0に、元の値を残したいビットを1にした値を作成してAND演算することで実現できます。

[例] ANDで(2進数における)任意の桁が0か1かを調べる
調べたい桁だけを1にし、それ以外を0にした数(この値のことをマスクなどともいいます)とAND演算して、結果がマスクと等しければ1で、等しくなければ0であると判ります。

2進数16進数10進数
000111101E30
AND)0000100008

0000100008
複数の桁を一気に判定することもできます。
2進数16進数10進数
001101103654
AND)1001000090144

000100001016

OR演算を使うと、任意のビットを1に変更することができます。
1にしたいビットを1に、元の値を残したいビットを0にした値を作成してOR演算することで実現できます。

[例] 2の0乗ビット〜2の3乗ビットを1にしたい場合

2進数16進数10進数
10110110B6182
OR)000011110F15

10111111BF191

XOR演算を使うと、任意のビットの値を反転することができます。

[例] 2の0乗ビット〜2の7乗ビットをすべて反転したい場合

2進数16進数10進数
10110110B6182
OR)11111111FF255

010010014973

【7】秀丸マクロでの使用例

※以下は今後ということで…(^^;

[例1] 文字コードの分類

[例2] charsetキーワードの操作

[例3] .hilightファイル内の値

[例4] searchoptionキーワードの操作


秀丸Q&A集準備室に戻る