Triad sou.

decimal / binary converter

十進数を二進数に変換する演算が必要になったので調べてみました。


wle package に binary() 関数というものがあり、そいつを少し弄ればよいことが分かった。
それだけではちょっとつまらなかったので、再帰を使って自分でも書いてみた。

# 再帰で書いた関数
d2b <- function(n) {
  n <- floor(n)
  d2bc <- function(n, b) {
    r <- n - 2*floor(n/2)
    q <- floor(n/2)
    b[length(b)+1] <- r
    if (q >= 1) {
      d2bc(q, b)
    } else {
      return(b)
    }
  }
  return(d2bc(n, NULL))
}

# binary() 関数から余計なものを省いた関数
mybinary <- function (x) {
  if (x == 0) {
    pos <- 1
  } else {
    pos <- floor(log(x, 2)) + 1
  }
  bin <- rep(0, pos)
  for (i in pos:1) {
    bin[i] <- floor(x/2^(i - 1))
    x <- x - ((2^(i - 1)) * bin[i])
  }
  return(bin)
}

n <- 900000000000000000000000000000000000000
d2b(n)
mybinary(n)

system.time(for(i in 1:1000) a<-d2b(n))
system.time(for(i in 1:1000) a<-mybinary(n))

当然再帰の方が遅くて、なんだか無駄な時間を過ごした。
まあいっか。