[質問]16進数の足し算の方法No.00338
k-1 さん 01/04/26 00:15
 
k-1です。こんばんは。
これまた大変稚拙な質問で申し訳ありませんが、下記について
ご教示ください。
10進による足し算はたとえば
##aaa = ##aaa + 1
とやれば1000まででも2000まででも際限なくできますが、
16進で例えば0000hからFFFFhまで足し算をしたい場合は
そのように記述すれば良いのでしょうか。
現在その方法が分からないので0だったら1にする、1だったら
2にする......EだったらFにするというようなまぬけな
方法を桁毎に採っています。4桁くらいなら良いのですが
それ以上になるとかなり面倒なので是非足し算による方法を
知りたいのです。色々調べたのですが分かりませんでした。
本件に関しまして何か良い解決法などありましたら、
是非その方法をご教示ください。
よろしくお願いいたします。

[ ]
RE:00338 [質問]16進数の足し算の方法No.00339
杉浦 まさき さん 01/04/26 01:05
 
k-1 さん、こんばんは。
杉浦 まさき です。
#田楽サーバのバグの件はもう少しお待ちを…m(_ _)m。

>10進による足し算はたとえば
>##aaa = ##aaa + 1
>とやれば1000まででも2000まででも際限なくできますが、
>16進で例えば0000hからFFFFhまで足し算をしたい場合は
>そのように記述すれば良いのでしょうか。

10 進か 16 進かは単に表示の問題ですから、
数値の足し算自体は上のと同じです。

あとは数値を 16 進数表示に変換、またはその逆の変換を
するような処理を行えばよいのですが…
なんか久しぶりに書いたスクリプトなんで
全然スマートじゃない&負の数の場合は結果がおかしい(^^;ですが、
以下のような感じでいけると思います。
#せめて & 演算子が欲しかった…。

; 呼出しのサンプル
call num2hex 12345
#hex = #return
message #hex ; "00003039"

call hex2num #hex
message #return ; "12345"

exit

; 数値を 8 桁の 16 進数に変換
; バグ:負の数は扱えない
num2hex:
    ##p = value(#1)
    #ret = ""
    ##a = 0
    while (##a < 8)
        ##n = ##p % 16 ; ##p < 0 の場合は…??
        #ret = part("0123456789ABCDEF",##n,1) + #ret
        ##p = ##p / 16 ; 4bit arithmetic right shift (^^;
        ##a = ##a + 1
    endwhile
    return #ret

; 16 進数を数値に変換
; バグ:負の数は扱えない
hex2num:
    ##ret = 0
    ##len = length(#1)
    ##a = 0
    while (##a < ##len)
        ##ret = ##ret * 16 ; 4bit left shift
        #s = part(#1,##a,1)
        ##n = length(drop("0123456789ABCDEF",toupper(#s)))
        ##ret = ##ret + ##n
        ##a = ##a + 1
    endwhile
    return ##ret


[ ]
RE:00339 [質問]16進数の足し算の方法No.00340
k-1 さん 01/04/26 10:21
 
>10 進か 16 進かは単に表示の問題ですから、
>数値の足し算自体は上のと同じです。
>
>あとは数値を 16 進数表示に変換、またはその逆の変換を
>するような処理を行えばよいのですが…
k-1です。
親切に記述までつけていただきありがとうございます。
「おぉ、なるほど!」とすぐに理解出来ないスキルの低さ
が悲しい(泣)。
これを元に自分のスクリプトに当てはめてみたいと思います。
どうもありがとうございました。

[ ]