如何判断一个数是否是2的幂?以下是我到目前为止的想法:
# check every number in a vector
y <- 1:100000000
x <- 2^(0:100)
y %in% x
y[(y %in% x)==TRUE]
# check a single number
y <- 250000
x <- 2^(0:100)
y %in% x
# check a single random number
y <- sample(1000000000,1)
x <- 2^(0:100)
y %in% x
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?上面的方法对我来说似乎不是很普遍,并且它在非常大的数字下失败,大概是因为四舍五入错误:
# 2^95 = 39,614,081,257,132,168,796,771,975,168
# correct
y <- 39614081257132168796771975168
x <- 2^(0:100)
y %in% x
# incorrect
y <- 39614081257132168796771975167
x <- 2^(0:100)
y %in% x
Run Code Online (Sandbox Code Playgroud)
其他语言的 Stack Overflow 上有许多类似的问题,答案似乎涉及位模式。这种方法可以用于R? 与这种方法相比,我的方法似乎并不复杂,我认为可能有更好的方法。谢谢你的任何建议。
是的,您可以查看 R 中的位模式:
isPowerOf2 <- function(x) {
n1s <- sum(as.numeric(intToBits(x)))
if (n1s == 1) {
return(TRUE)
} else {
return(FALSE)
}
}
Run Code Online (Sandbox Code Playgroud)
根据请求,发布bigz巨数解决方案:注意:-class numbers的as.character方法bigz采用一个参数b,该参数指定在转换为字符之前将数字转换为什么基数。
> bar<-as.bigz(2)^95;
> bar
Big Integer ('bigz') :
[1] 39614081257132168796771975168
> as.character(bar,b=2)
[1] "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
> foo<-prev
> table(unlist(strsplit(foo,'')))
0 1
95 1
Run Code Online (Sandbox Code Playgroud)
或者,对于 2 的非幂,
> bbar<-bar+1
> table(unlist(strsplit(as.character(bbar,b=2),'')))
0 1
94 2
Run Code Online (Sandbox Code Playgroud)