![]() |
第III部〜秀丸マクロのいろはにほへと
|
●ビット演算を極める
【0】ここに書いてあること
【1】はじめに − 秀丸で使えるビット演算子
【2】2進数、16進数とは
【3】秀丸マクロでの16進数の記述方法
【4】ビット演算の概念
【5】ビット演算の詳細
【6】ビット演算でできること
【7】秀丸マクロでの使用例 ※この項はまだ執筆中です。m(_ _)m
【0】ここに書いてあること
秀丸エディタのマクロの中でも、応用的な機能の中には、2進数の概念やビット演算を使用する必要がある部分があります。
例えば、
- 検索方法を設定するsetsearch文
- .hilightファイル内のフラグの記述
- 文字コードの分類(例えば、2バイト文字かどうか、半角カタカナかどうか)を行う場合
C言語など、他の言語でこれらの概念や演算子を理解されている方はまだしも、初めての方はとっつきにくい部分もあるかと思います。
この章では、ビット演算のしくみと秀丸マクロでの使い方について説明します。
【1】はじめに − 秀丸で使えるビット演算子
秀丸で使えるビット演算子は以下の3種類があります。
と言われて、分かった、という方は、以下の説明は多分必要ないでしょう。「ANDってどういうこと?」「ビット毎って何?」と思われる方もいらっしゃることと思います。
& ビット毎のAND | ビット毎のOR ^ ビット毎のXOR [補足]
^ は、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進数 0 0 0 1 1 1 2 10 2 3 11 3 4 100 4 5 101 5 6 110 6 7 111 7 8 1000 8 9 1001 9 10 1010 A : 15 1111 F 16 10000 10 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 = 0OR
少なくともどちらかが1の場合に結果として1が返り、両方とも0の場合は0になります。
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0XOR
両方のビットが異なる場合にだけ結果として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進数 10110110 B6 182 AND) 10001000 88 136
10000000 80 128
2進数 16進数 10進数 10110110 B6 182 OR) 10001000 88 136
10111110 BE 190
2進数 16進数 10進数 10110110 B6 182 XOR) 10001000 88 136
00111110 3E 62 これを実際に秀丸マクロで記述すると以下のようになります。
#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進数 00011110 1E 30 AND) 00001000 08 8
00001000 08 8
2進数 16進数 10進数 00110110 36 54 AND) 10010000 90 144
00010000 10 16 OR演算を使うと、任意のビットを1に変更することができます。
1にしたいビットを1に、元の値を残したいビットを0にした値を作成してOR演算することで実現できます。[例] 2の0乗ビット〜2の3乗ビットを1にしたい場合
2進数 16進数 10進数 10110110 B6 182 OR) 00001111 0F 15
10111111 BF 191 XOR演算を使うと、任意のビットの値を反転することができます。
[例] 2の0乗ビット〜2の7乗ビットをすべて反転したい場合
2進数 16進数 10進数 10110110 B6 182 OR) 11111111 FF 255
01001001 49 73
【7】秀丸マクロでの使用例
※以下は今後ということで…(^^;
[例1] 文字コードの分類
- 2バイト文字かどうか
- 半角カタカナ
[例2] charsetキーワードの操作
[例3] .hilightファイル内の値
[例4] searchoptionキーワードの操作