首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将整数转换为base36

将整数转换为base36
EN

Stack Overflow用户
提问于 2016-03-16 12:57:43
回答 3查看 2.1K关注 0票数 8

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

代码语言:javascript
复制
strtoi("zzzz",base=36)
[1] 1679615

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

代码语言:javascript
复制
itostr(1679615,base=36)
[1] "zzzz"

(我不需要36以外的任何基数,但是base参数最好有。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-16 13:47:07

我相信如果您安装包BBmisc,它具有itostr功能。

代码语言:javascript
复制
library(BBmisc)
itostr(1679615,base=36)
[1] "zzzz"
票数 7
EN

Stack Overflow用户

发布于 2016-03-16 13:39:10

我不知道有什么实现,但是算法没有那么难。这里有一个在32位有符号整数上工作的。

代码语言:javascript
复制
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包。

票数 5
EN

Stack Overflow用户

发布于 2016-03-16 13:57:12

一个快速的Rcpp黑客这个也会让你得到它:

代码语言:javascript
复制
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-背,所以它可能是一个很好的、具有表现力的选择。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36036404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档