如何递归/重复地将二进制函数(逐位XOR)应用于R中的向量



我有一个数字向量,我们称之为v,我想将其所有值异或的结果计算在一起,即我想找到v[1] XOR v[2] XOR v[3]。。。

我有来自包bitops的二进制位异或函数bitXor。有没有一个简洁的代码我可以使用,它的作用就像*apply函数,并且在不使用显式循环的情况下一次性完成整个XORing?我很高兴有一个适用于任何合适的二进制函数的解决方案,或者我错过了一个不止二进制XOR的实现。

首先,从这里窃取二进制转换函数-将二进制字符串转换为二进制或十进制值

BinToDec <- function(x) {
    sum(2^(which(rev(unlist(strsplit(as.character(x), "")) == 1))-1))
}

所以,你可以这样做:

vals <- c("101", "110", "11")
Reduce(bitXor, vapply(vals, BinToDec, FUN.VALUE=numeric(1)) )
#[1] 0

或者看每一步,你可以做:

Reduce(bitXor, vapply(vals, BinToDec, FUN.VALUE=numeric(1)), accumulate=TRUE)
#[1] 5 3 0

相当于:

c(bitXor(5,0), bitXor(5,6), bitXor(bitXor(5,6),3))
#[1] 5 3 0

最新更新