我有一个表示对象状态的数字,我想检查其中一个状态。例如,如果数字为“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")
所以那些没有被包裹或任何奇怪的东西覆盖。
答案 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)
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
会为你做那件事。 (另请注意==
在此强制其对公共类的论证)