8

strtoi(x,base=36)将 base36 编码的字符串转换为整数:

strtoi("zzzz",base=36)
[1] 1679615

是否有反转此操作的函数,即,给定一个正整数会产生 base36 等效项?本质上,我正在寻找itostr()这样的功能

itostr(1679615,base=36)
[1] "zzzz"

(我不需要除 36 以外的任何基数,但有一个base参数会很好。)

4

3 回答 3

7

我相信如果你安装包BBmisc,它就有 itostr 功能可用。

library(BBmisc)
itostr(1679615,base=36)
[1] "zzzz"
于 2016-03-16T13:47:07.783 回答
5

我不知道任何实现,但算法并不难。这是一个适用于 32 位有符号整数的方法。

intToBase36 <- function(int) {
  stopifnot(is.integer(int) || int < 0)

  base36 <- c(as.character(0:9),LETTERS)
  result <- character(6)
  i <- 1L
  while (int > 0) {
    result[i] <- base36[int %% 36L + 1L]
    i <- i + 1L
    int <- int %/% 36L
  }
  return(paste(result, sep="", collapse=""))
}

如果需要支持更大的整数,可以使用bit64Rmpfr包。

于 2016-03-16T13:39:10.877 回答
4

一个快速的 Rcpp hack会让你得到它:

library(inline)

cxxfunction(signature(x="numeric"), body='
unsigned int val = as<unsigned int>(x);
static char const base36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::string result;
result.reserve(14);
do {
  result = base36[val % 36] + result;
} while (val /= 36);
return wrap(result);
', plugin="Rcpp") -> base36enc

base36enc(36)
## [1] "10"

base36enc(72)
## [1] "20"

base36enc(73)
## [1] "21"

不过,它肯定需要更多代码用于生产用途。

另一个答案中引用的BBmisc包也是C 支持的,因此它可能是一个不错的高性能选择。

于 2016-03-16T13:57:12.830 回答