选择十进制数字的所有二进制邻居,它们恰好是n个数字

时间:2015-08-20 13:17:06

标签: r

我们说我有十进制格式的数字:5

其二进制版本为:00101

我想写一个带十进制数x

的函数

并返回与原始数字有n数字差异(二进制形式)的所有其他十进制数字:

因此,对于上面的示例,如果n2,那么我正在查找00101的完全n=2位数不同的所有邻居。

然后我想获得与这些二进制邻居相对应的小数。

这可能吗?

要获得一位数的邻居,我可以使用:

bin_neighs = function(x, n) bitwXor(x, (2 ^ (0:(n - 1))))

我的问题是:我怎样才能将这个从一个数字的邻居推广到n个数字的邻居?

1 个答案:

答案 0 :(得分:1)

您可以通过找到所需长度和数字位数的所有位掩码然后执行按位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   100