{integer包含一些2的幂}函数

时间:2013-09-26 21:51:40

标签: r

我有一个表示对象状态的数字,我想检查其中一个状态。例如,如果数字为“22”,则在检查16,4或2时应返回true,对其他任何内容应返回false。 我的功能是

containsOrderType <- function(orderType, state) #returns whether the bitmask translates to containing that order type
{
  state <- as.numeric(state)
  if(orderType>state) return(FALSE)
  binState <- as.integer(state)
  class(binState) <- "binmode"
  binState <- as.character(binState)
  dim(binState) <- dim(state)
  X<-log2(orderType)+1
  if(str_sub(binState,-X,-X)==1) return(TRUE)
  return(FALSE)
}
直到今天这个工作正常一个月,我很确定问题是昏暗(状态)正在变暗([整数])似乎总是“空”。这发生在R 2.15.3和R 3.0.1中。 我得到它,如果那是一致的,但这个功能完全按照预期工作了一段时间,现在它没有。 这是R.Utils中的intToBin函数,它与我函数的第3-6行相同。

function (x) 
{
    y <- as.integer(x)
    class(y) <- "binmode"
    y <- as.character(y)
    dim(y) <- dim(x)
    y
}

>dim
function (x)  .Primitive("dim")
> class
function (x)  .Primitive("class")

所以那些没有被包裹或任何奇怪的东西覆盖。

3 个答案:

答案 0 :(得分:5)

尝试基础R中的bitwAnd函数,例如

> bitwAnd(22, 2^(0:10))
 [1]  0  2  4  0 16  0  0  0  0  0  0
> bitwAnd(1:22, 16)
 [1]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 16 16 16 16 16 16 16
> bitwAnd(4, 2060)
[1] 4
> (bitwAnd(8, 2060) != 0) == containsOrderType(8, 2060)
> TRUE

bitops包中的bitAnd

答案 1 :(得分:0)

显然我在我的程序中移动了一些东西并且不知何故没有包含R.utils本身...奇怪因为我认为我复制了代码所以我必须包含该包。 无论如何,我会留下它,以防其他人需要它。 因为无论如何我都包含了这个包,我的代码可以简化为:

containsOrderType <- function(orderType, state) #returns whether the bitmask translates to containing that order type
{
  state <- as.numeric(state)
  if(orderType>state) return(FALSE)
  binState <- intToBin(as.integer(state))
  X<-log2(orderType)+1
  if(str_sub(binState,-X,-X)==1) return(TRUE)
  return(FALSE)
}

答案 2 :(得分:0)

您可以将gmp::factorize用作:

Rgames> 2%in%as.numeric(factorize(20))
[1] TRUE

请注意,gmp函数会返回bigz类内容,这就是

的原因
Rgames> 2%in%factorize(20)
[1] FALSE

发生。

要回答对冲和评论的评论 - 如果您希望数字的最大功率为2,那么

Rgames> 2^(sum(factorize(20)==2))
[1] 4

会为你做那件事。 (另请注意==在此强制其对公共类的论证)