是 2 的幂

Mar*_*ler 4 largenumber r

如何判断一个数是否是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? 与这种方法相比,我的方法似乎并不复杂,我认为可能有更好的方法。谢谢你的任何建议。

Sco*_*hie 5

是的,您可以查看 R 中的位模式:

isPowerOf2 <- function(x) {
  n1s <- sum(as.numeric(intToBits(x)))
  if (n1s == 1) {
    return(TRUE)
  } else {
    return(FALSE)
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您执行 `bar&lt;-bigz(2)^95;as.character(bar,b=2)`,则可扩展为 `bigz` 整数。然后您可以计算字符串中“1”的出现次数。 (2认同)

Car*_*oft 5

根据请求,发布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)