将整数转换为 base36
Convert an integer to base36
strtoi(x,base=36)
将 base36 编码的字符串转换为整数:
strtoi("zzzz",base=36)
[1] 1679615
是否有一个函数可以反转此操作,即给定一个正整数会产生 base36 等价物?本质上,我正在寻找一个 itostr()
函数使得
itostr(1679615,base=36)
[1] "zzzz"
(我不需要除 36 以外的任何基数,但是 base
参数会很好。)
我不知道有什么实现,但是这个算法并不难。这是一个适用于 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=""))
}
我相信如果你安装包 BBmisc,它有 itostr 功能可用。
library(BBmisc)
itostr(1679615,base=36)
[1] "zzzz"
一个快速的 Rcpp hack of this 也会让你得到它:
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-backed 所以它可能是一个不错的高性能选择。
strtoi(x,base=36)
将 base36 编码的字符串转换为整数:
strtoi("zzzz",base=36)
[1] 1679615
是否有一个函数可以反转此操作,即给定一个正整数会产生 base36 等价物?本质上,我正在寻找一个 itostr()
函数使得
itostr(1679615,base=36)
[1] "zzzz"
(我不需要除 36 以外的任何基数,但是 base
参数会很好。)
我不知道有什么实现,但是这个算法并不难。这是一个适用于 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=""))
}
我相信如果你安装包 BBmisc,它有 itostr 功能可用。
library(BBmisc)
itostr(1679615,base=36)
[1] "zzzz"
一个快速的 Rcpp hack of this 也会让你得到它:
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-backed 所以它可能是一个不错的高性能选择。