假设我有一个十进制格式的数字:5
它的二进制版本是:00101
我想写一个采用十进制数x的函数
并返回与原始数字具有n数字差异(以二进制形式表示)的所有其他十进制数:
因此,对于上面的例子,如果n是2,那么我将查找00101的所有邻居,这些邻居在n=2位数上完全不同。
然后我要得到那些二进制邻居对应的小数。
这有可能做到吗?
要获得一个数字邻居,我可以使用:
bin_neighs = function(x, n) bitwXor(x, (2 ^ (0:(n - 1))))我的问题是:我如何把它从一个数字邻居推广到n个数字邻居?
发布于 2015-08-20 13:33:21
您可以通过查找所有设置了所需长度和数字数的位掩码,然后执行逐位xor来概括这一点:
bin_neighs <- function(x, nf, n) {
bitwXor(x, colSums(combn(2^(0:(n-1)), nf)))
}
bin_neighs(5, 2, 5)
# [1] 6 0 12 20 3 15 23 9 17 29使用x=5的二进制扩展到n=5数字: 00101,我们可以确认这是正确的。翻转nf=2数字会产生以下可能性:
00110 = 6 # Flip 4 and 5
00000 = 0 # Flip 3 and 5
01100 = 12 # Flip 2 and 5
10100 = 20 # Flip 1 and 5
00011 = 3 # Flip 3 and 4
01111 = 15 # Flip 2 and 4
10111 = 23 # Flip 1 and 4
01001 = 9 # Flip 2 and 3
10001 = 17 # Flip 1 and 3
11101 = 29 # Flip 1 and 2对于稍微大一点的投入,这也应该有效地发挥作用。例如,它可以在10毫秒内翻转15位中的9位:
library(microbenchmark)
microbenchmark(bin_neighs(1,9,15))
# Unit: milliseconds
# expr min lq mean median uq max neval
# bin_neighs(1, 9, 15) 7.472961 8.023485 8.848333 8.237502 8.594779 33.61931 100https://stackoverflow.com/questions/32119306
复制相似问题