2015年11月5日木曜日

Rで10進数→16進数、16進数→10進数の変換

10進数から16進数に変換する方法の1つとして、sprintfを使う方法があります。

> sprintf("%X", 0:31) 
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"
 [9] "8"  "9"  "A"  "B"  "C"  "D"  "E"  "F"
[17] "10" "11" "12" "13" "14" "15" "16" "17"
[25] "18" "19" "1A" "1B" "1C" "1D" "1E" "1F"


16進といえば、色のRGB値を指定するときに使ったりしますが、その場合は "7" とか "F" ではなく "07" とか "0F" とかの形で欲しいですよね。

そういうときは、

> sprintf("%02X", 0:31)
 [1] "00" "01" "02" "03" "04" "05" "06" "07"
 [9] "08" "09" "0A" "0B" "0C" "0D" "0E" "0F"
[17] "10" "11" "12" "13" "14" "15" "16" "17"
[25] "18" "19" "1A" "1B" "1C" "1D" "1E" "1F"


とすればOK。

sprintfの書式を知っている人には蛇足ですが、「%02X」の意味は、
  "X": 16進で
  "2": 2桁で
  "0": 桁が足りないときは0詰めで
という指示になります。

16進数でのRGB指定を使ってちょっと遊んでみましょう。

# まず枠だけプロット
plot( 0, 0, xlim=c(0,255), ylim=c(0,255),
      type="n", xlab="R", ylab="G" )

# 16進の値を取り出すためのテーブル
h <- sprintf("%02X", 0:255)

for(r in 1:256) {
  for(g in 1:256) {
    col <- paste("#", h[r], h[g], "00", sep="")
    points(r, g,  col=col)
  }
}

colオプションでRとGを変化させながらプロット

青(B)を固定して、赤(R)と緑(G)を変化させたグラデーションができました。

また、10進から16進への変換を行う方法として、as.hexmode関数を使うというのもあります。

> as.hexmode(31)
[1] "1f"

表示結果は文字列(character)っぽいですが、実は違っていて、hexmodeという16進の型になっているみたいです。

> class(as.hexmode(31))
[1] "hexmode"

なので、

> a <- as.hexmode(7)
> a
[1] "7"

> b <- as.hexmode(8)
> b
[1] "8"

> a + b
[1] "f"

> a * b
[1] "38"

のように、16進数として演算も行われます。

この この "38"(さん はち)が、10進での56(7×8の結果)になっているかどうかは、下記のようにして確認できます。

> 0x38
[1] 56

16進から10進への変換は、「0x」を付けるだけで行えるんですね。




0 件のコメント:

コメントを投稿