我有一个数字向量,我们称之为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