2進数→16進数 16進数→2進数変換についてNo.04554
櫻井章一 さん 04/12/03 11:08
 
こんにちは、櫻井章一です。
先日の質問では、親切に教えていただきありがとうございました。

現在、"4桁"の2進数を16進数、"1桁"の16進数→2進数変換をするのに
下記のような方法で実現しています。
この方法ですと、1111→F 、F→1111といった場合は一回の処理ですむのですが
11111111→FF 、FF→11111111としたいときは処理を繰り返さなければならず
桁数が増えていくと、どんどん処理回数が増えてしまいます。
これをなんとかしたいと、いろいろ試行錯誤したのですがなかなかうまくいきません
ので
もしよろしければ何かスマートな方法をご教授願えないでしょうか?
よろしくお願いいたします。

//16進→2進変換
beginsel;
right 4;
cut;
beginclipboardread;
$code=getclipboard;
if($code == "0000"){
 insert "0";
}else if($code == "0001"){
 insert "1";
       ・
       ・
       ・
}else if($code == "1111"){
 insert "F";
}

//2進→16進変換
 beginsel ;
 right 1;
 cut;
 beginclipboardread;
 $code=getclipboard;
 if($code == "0"){
  insert "0000";
 }else if($code == "1"){
  insert "0001";
 }else if($code == "2"){
  insert "0010";
       ・
       ・
       ・
 }else if($code == "F"){
  insert "1111";
 }

[ ]
RE:04554 2進数→16進数 16進数→2進数変No.04555
ながさわ さん 04/12/04 01:17
 
こんにちは、ながさわです。

10進数⇔16進数は関数が用意されていますからそれを使うとして、
10進数⇔2進数部分を「指折り数える」ロジックで書いてみました。
エラーチェックなどはしてません。

call hex2bin "6";
message $$return;
call bin2hex "1001";
message $$return;
endmacro;


hex2bin:
$$bin = "";
##dec = val("0x" + $$1);
while(##dec > 0){
    ##ans = ##dec & 1;
    $$bin = str(##ans) + $$bin;
    ##dec = (##dec - ##ans) / 2;
}
return rightstr("0000" + $$bin, 4);



bin2hex:
$$bin = $$1;
##dec = 0;
##l = strlen($$bin) - 1;
##r = 1;
while(##l >= 0){
    if(midstr($$bin, ##l, 1) == "1"){
        ##dec = ##dec + ##r;
    }
    ##l = ##l - 1;
    ##r = ##r * 2;
}
return hex(##dec);

[ ]
RE:04554 2進数→16進数 16進数→2進数変No.04556
IKKI さん 04/12/04 01:58
 
IKKI です。こんばんは。

> 現在、"4桁"の2進数を16進数、"1桁"の16進数→2進数変換をするのに
> 下記のような方法で実現しています。

秀丸マクロの問題というより、プログラミングの例題ですね。
http://www.comm.twcu.ac.jp/~nabe/lec-2003/etc/CompScience.html

> この方法ですと、1111→F 、F→1111といった場合は一回の処理ですむのですが
> 11111111→FF 、FF→11111111としたいときは処理を繰り返さなければならず
> 桁数が増えていくと、どんどん処理回数が増えてしまいます。

while 文を使って文字列を1文字ずつ処理する例が参考になります。
http://homepage2.nifty.com/jr-kun/hidemaru_qa/HMM0044A.html

それと、秀丸の「マクロ入門用ヘルプ」がかなり助けになると思います。
マクロヘルプ目次の「マクロを初めて作成する方はこちらへ」というリンクを
クリックすると現れます。

ロジックを考えるのも楽しいものです。ご健闘をお祈りします。 o(^^)o






▼愚直な解答例
(選択範囲が対象。「4桁ずつ」という仕様は無視してます)
---------------
// 16進→2進
call NumToBin val("0x" + gettext(seltopx, seltopy, selendx, selendy));
insert $$return;
endmacro;

NumToBin:  // 数値 → 2進表記文字列
    ##num = ##1;
    while (##num > 0) {
        $$bin = str(##num % 2) + $$bin;
        ##num = ##num / 2;
    }
    return $$bin;
---------------
// 2進→16進
call BinToNum gettext(seltopx, seltopy, selendx, selendy);
insert hex(##return);
endmacro;

BinToNum:  // 2進表記文字列 → 数値
    while (##p < strlen($$1)) {
         ##num = ##num * 2 + val(midstr($$1, ##p, 1));
         ##p = ##p + 1;
    }
    return ##num;


と、だらだら書いてるうちに ながさわ さんがスマートな解答例を出されていますね
…。(汗)

[ ]
RE:04555 2進数→16進数 16進数→2進数変No.04557
山紫水明 さん 04/12/04 20:24
 
 ながさわさん,こんばんは。
 横から失礼します。

>エラーチェックなどはしてません。

2桁の16進数も表しいたということなので,

>return rightstr("0000" + $$bin, 4);
の部分は,単に
return $$bin;
あるいは,
return rightstr("00000000" + $$bin, 8);
などとした方がよいのではないかと思いますが。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:04554 2進数→16進数 16進数→2進数変No.04558
櫻井章一 さん 04/12/06 08:54
 
ながさわさん、IKKIさん、 山紫水明さん  
ご回答ありがとうございました。

教えてくださったような、書き方は私には思いもつかない
ものでした。プログラミングも奥が深いですね。

>秀丸マクロの問題というより、プログラミングの例題ですね。
>http://www.comm.twcu.ac.jp/~nabe/lec-2003/etc/CompScience.html
>while 文を使って文字列を1文字ずつ処理する例が参考になります。
>http://homepage2.nifty.com/jr-kun/hidemaru_qa/HMM0044A.html

これからは、聞いてばかりにならないようIKKIさんが教えてくださった
サイト・マクロ入門を参考にもっとプログラミングについてしっかり
勉強していきたいです。
みなさま、今回はありがとうございました。

[ ]