我们说我有十进制格式的数字:5
其二进制版本为:00101
我想写一个带十进制数x
并返回与原始数字有n
数字差异(二进制形式)的所有其他十进制数字:
因此,对于上面的示例,如果n
为2
,那么我正在查找00101
的完全n=2
位数不同的所有邻居。
然后我想获得与这些二进制邻居相对应的小数。
这可能吗?
要获得一位数的邻居,我可以使用:
bin_neighs = function(x, n) bitwXor(x, (2 ^ (0:(n - 1))))
我的问题是:我怎样才能将这个从一个数字的邻居推广到n个数字的邻居?
答案 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