« 整数値の任意の位の数字を取り出す | トップページ | 忘れられちゃうので。 »

整数値の最高位数字を取り出す

前回の記事で、「整数値の任意の位の数字を取り出す」サンプルを紹介しましたが、今回は最高位数字を取り出すサンプルです。

「10進の整数値を、1~9のフラグの並び」とする見方を最後にチラッと言いました。先頭のフラグは何なのかがわかると、後ろからフラグを入れていって必要なときに先頭のフラグを取り出す、ということができますね。たぶん、便利に使える時があります。

362
362 ←4
3624
3← 624

後ろから入れて先頭を取り出すイメージ

最高位の数を取り出すには、まず目的の変数が何桁かを求めなくてはいけません。これには、対数(log)を使います。とくに、10進数の桁数なので常用対数(log10)を使います。ここでは「放り込んで切り捨てると桁数が出てくる」とだけ紹介しますが、対数については、Google先生に聞いてみると詳しくて分かりやすい説明があるかと思います。

あとは、桁数が分かっているので、[10の桁数-1乗]で割って切り捨てます。

(例)
63291÷10000=6.3291
切り捨てて 6

ではサンプルコード行きます。

//ダミー変数の用意
Var num
set num 63291 //こいつの"6"を取り出したい

//最高位数字を求める
Var len
log10 len num
cnvint len //len=numの桁数(意図的に切り捨てた)

Var pow10 //10のべき乗を求めます
set pow10 10
Var i
set i 1
:powloop
mul pow10 10
add i 1
if< i len // "if<="ではないことに注目
  jump powloop
endif
// DrawVar pow10 //pow10=10^(len)

Var top
mov top num
div top pow10

DrawVar top //"6"と出力されるはず
DrawVar num //"63291"と出力されるはず

長くなってしまいました。サンプルを作りながら気づいたのですが、VRMスクリプトに指数関数(power operator)系の命令ってないんですね。仕方がないので//10のべき乗を求めますのところでloop仕組んで10を[len-1]回掛け算するように仕向けました。ループまで今回説明しだすと大変なので別の機会に譲ることにします。いつになるかはわかりませんが。

ちなみに、最後に

mod num pow10

とやると、numの最高位数字6を取った3291が出力されます。

そして、一の位に後ろからフラグを足すには、10倍して好きな一桁の数を足せばいいので、

mul num 10
add num ?
DrawVar num

とすればOKです。(ハテナのところに好きな数字を入れといて下さい)

|

« 整数値の任意の位の数字を取り出す | トップページ | 忘れられちゃうので。 »

VRM:研究」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 整数値の最高位数字を取り出す:

« 整数値の任意の位の数字を取り出す | トップページ | 忘れられちゃうので。 »