小ワザ
○進数の相互変換 †
ここでは2/8/16/10進数の相互変換の方法について解説します。
strf関数を使うと簡単に変換できます。
1
2
3
4
|
| a = strf("%x", 255) mes a
a = strf("%o", 10) mes a
|
APIを使用することで任意の進数の文字列に変換することが出来ます。
1
2
3
4
5
6
7
|
| #uselib "msvcrt"
#func ltoa "_ltoa" int,var,int
sdim a,64
ltoa 11, a, 2 : mes "11 = " + a + "( 2進数)"
ltoa 11, a, 8 : mes "11 = " + a + "( 8進数)"
ltoa 11, a,16 : mes "11 = " + a + "(16進数)"
ltoa 11, a, 3 : mes "11 = " + a + "( 3進数)"
|
セキュリティが強化されたバージョン
1
2
3
4
5
6
7
|
| #uselib "msvcrt"
#func ltoa_s "_ltoa_s" int,var,int,int
sdim a,64
ltoa_s 11, a, 64, 2 : mes "11 = " + a + "( 2進数)"
ltoa_s 11, a, 64, 8 : mes "11 = " + a + "( 8進数)"
ltoa_s 11, a, 64,16 : mes "11 = " + a + "(16進数)"
ltoa_s 11, a, 64, 3 : mes "11 = " + a + "( 3進数)"
|
10進数→2進数
/小ワザ/ビット操作#zf302537
16進数→10進数の場合はintを使うと手軽に行えます。
1
2
|
| mes int("$ff")
mes $ff
|
しかし、2/8進数ではこの方法を使用することは出来ません。
そこでAPIのstrtoulを使って変換します。
1
2
3
4
5
6
7
8
9
|
| #uselib "msvcrt"
#cfunc strtoul "strtoul" str, nullptr, int
mes strtoul("111", 2) mes %111
mes strtoul("12", 8)
mes strtoul("FF", 16) mes $ff
|
2進数→10進数
1
2
|
| mes int("%11")
mes %11
|
16進数→10進数
1
2
3
|
| #cfunc strtol "strtol" str, nullptr, int
mes strtol("ffffffff", 16)
mes 0xffffffff
|
- 公式掲示板の方で_ltoa関数という便利なのが紹介されていたので、こっちにも掲載。moaさんありがとう。 -- GENKI?