マクロ評価のお願いNo.01875
KoKo_DoKo さん 01/03/22 13:34
 
始めまして、KoKo_DoKo と申します。

早速で恐縮ですが、以下のマクロを評価してもらえないでしょうか。
文字数をカウントすると言うマクロの一部なんですが、全角の文字を
カウントする部分がどうも不安です。
"else" と一区切りで括っていいものかどうか…

#tabs=タブ, #eng=半角英数, #space=半角空白, #kana=半角カナ
#jpn=全角文字, #zspace=全角空白, #depend=機種依存文字

//--------------------------------------
          ・
          ・
if(code == 0x0D){
  right;
  continue;
}else if(code == 0x09){
  #tabs = #tabs + 1;
}else if(code >= 0x20 && code <= 0x7E){
  #eng = #eng + 1;
  if(code == 0x20) #space = #space + 1;
}else if(code >= 0xA6 && code <= 0xDD){
  #kana = #kana + 1;
}else{
  //ここで全角文字数をカウント(ここが不安)
  #jpn = #jpn + 1;
  if(char(code) == " "){
    #zspace = #zspace + 1;
  }else{
    if((code >= 0x8540 && code <= 0x889E) ||
      (code >= 0xEAA5 && code <= 0xFCFC)){
      #depend = #depend + 1;
    }
  }
}
          ・
          ・
//--------------------------------------

[ ]
RE:01875 マクロ評価のお願いNo.01876
でるもんた さん 01/03/22 15:08
 
> 文字数をカウントすると言うマクロの一部なんですが、全角の文字を
> カウントする部分がどうも不安です。
> "else" と一区切りで括っていいものかどうか…

> if(code == 0x0D){
>   right;
>   continue;
...
> }else{
>   //ここで全角文字数をカウント(ここが不安)

コントロールコードがありますから、else if (code >= 0x8140)
のほうがいいんじゃないでしょうか。

[ ]
RE:01875 マクロ評価のお願いNo.01877
TAKA さん 01/03/22 15:41
 
TAKA です。

>早速で恐縮ですが、以下のマクロを評価してもらえないでしょうか。
>文字数をカウントすると言うマクロの一部なんですが、全角の文字を
>カウントする部分がどうも不安です。

2バイト文字の判断は、
    if( ( code & 0xff00 ) != 0 )
    { // 2バイト文字
    }
で良いと思います。

[ ]
RE:01877 マクロ評価のお願いNo.01878
KoKo_DoKo さん 01/03/22 16:41
 
KoKo_DoKo と申します。

でるもんたさん、TAKAさん、早速の返信ありがとうございます。

>2バイト文字の判断は、
>    if( ( code & 0xff00 ) != 0 )
>    { // 2バイト文字
>    }
>で良いと思います。

TAKAさんへ

恥ずかしい話ですが、上記の "(code & 0xff00) != 0" 部分が
私には理解できません。
出来れば、解説等をしてもらえないでしょうか。

[ ]
RE:01878 マクロ評価のお願いNo.01879
TAKA さん 01/03/22 17:16
 
TAKA です。

>恥ずかしい話ですが、上記の "(code & 0xff00) != 0" 部分が
>私には理解できません。
>出来れば、解説等をしてもらえないでしょうか。

これは、ビット演算を利用しています。
ビット演算には、AND,OR,XORなどがあります。

0011
0101 AND
----
0001 結果(両方が1の時に1)

0011
0101 OR
----
0111 結果(どちらか1方に1があれば1)

0011
0101 XOR
----
0110 結果(片方が0で片方が1の時に1)

0xffffをビットで表現すると、「1111 1111 1111 1111」となりま
す。
1バイト文字の場合は、「0000 0000 ???? ????」となります。
2バイト文字であれば、先頭の部分の8ビットのどこかに「1」が
たっている訳ですから、「1111 1111 0000 0000」とのANDを取るこ
とで、お互いのビットが「1」であれば、演算の結果そのビットは
「1」となります。

例(2バイト文字)
1111 1111 0000 0000
0101 0101 0101 0101 AND
-------------------
0101 0101 0000 0000

例(1バイト文字)
1111 1111 0000 0000
0000 0000 0101 0101 AND
-------------------
0000 0000 0000 0000

つまり、1バイト文字であれば「0」となります。
というわけで、「0xff00」とANDを取って「0」でなければ、2バイ
ト文字と見なせるわけです。

[ ]
RE:01879 マクロ評価のお願いNo.01880
KoKo_DoKo さん 01/03/22 19:37
 
KoKo_DoKo と申します。

TAKAさんの投稿から

>これは、ビット演算を利用しています。
>ビット演算には、AND,OR,XORなどがあります。

TAKAさん、分かり易い解説ありがとうございます。
理屈は理解できました。(問題は、応用できるかですが…)

早速マクロを修正し、不安を一掃して操作しております。
ではこれにて…

[ ]
RE:01879 マクロ評価のお願いNo.01882
山紫水明 さん 01/03/22 20:16
 
 TAKAさん,こんばんは。
 横から失礼します。
 ビット演算の丁寧なご説明感服いたします。それでついでに教えてください。

(code & 0xff00) != 0

(code > 0xff)
の実際上の差異はどこにあるのでしょうか?
 ビットを直接あつかった方が速度上,少しでも有利になるというようなメリット
があるのでしょうか?

     では, (^^)/~
                                        山紫水明

[ ]
RE:01882 マクロ評価のお願いNo.01884
TAKA さん 01/03/22 22:05
 
TAKA です。

>(code & 0xff00) != 0
>と
>(code > 0xff)
>の実際上の差異はどこにあるのでしょうか?

32ビット版の秀丸に限定するなら差異はありません。
何故なら数値が32ビットで扱われますので、0xffffという値が正
の値(65535)になるので、0xffff > 0xffを満たすからです。

16ビット版の秀丸なら駄目だと思います。(試してはいませんが)
何故駄目かというと、0xffffという値が負の値(-1)になるので、
0xffff(負) > 0xff(正)を満たしません。
何故-1かというと、1の補正という概念からです。
これは一番上位のビットが1の時にはマイナスの値になりますので、
まずビットを反転させて0x0000にし、それに1を足して0x0001にし
たものをマイナスにしたものが求める値の-1となります。
2バイト文字のコードには最上位ビットがたっていますので、
code > 0xffを満たさなくなります。

但し、16ビット版の秀丸が数値変数を16ビットで扱わずに32
ビットで扱っていれば、32ビット版の秀丸同様に動きます。

以上のような理由からも、ビット演算を使っていますが、一番の理
                                                    ^^^^^^^^
由は、自分の調べたいところが、1になっているかどうかを調べる
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ためです。
^^^^^^^^^^

[ ]
RE:01884 マクロ評価のお願いNo.01888
山紫水明 さん 01/03/22 23:39
 
 TAKAさん,こんばんは。

》16ビット版の秀丸なら駄目だと思います。(試してはいませんが)
》何故駄目かというと、0xffffという値が負の値(-1)になるので、
》0xffff(負) > 0xff(正)を満たしません。

 そうか,こういう問題があったのですね,どこかで聞いたような気がしますが。
きちんとした勉強をしてないもので。
 よくわかりました。どうもありがとうございました。

     では, (^^)/~
                                        山紫水明

[ ]