首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择所有十进制数的二进制邻域,它们完全不同于n位数。

问选择所有十进制数的二进制邻域,它们完全不同于n位数。
EN

Stack Overflow用户
提问于 2015-08-20 13:17:05
回答 1查看 48关注 0票数 0

假设我有一个十进制格式的数字:5

它的二进制版本是:00101

我想写一个采用十进制数x的函数

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

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

然后我要得到那些二进制邻居对应的小数。

这有可能做到吗?

要获得一个数字邻居,我可以使用:

代码语言:javascript
复制
bin_neighs = function(x, n) bitwXor(x, (2 ^ (0:(n - 1))))

我的问题是:我如何把它从一个数字邻居推广到n个数字邻居?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 13:33:21

您可以通过查找所有设置了所需长度和数字数的位掩码,然后执行逐位xor来概括这一点:

代码语言:javascript
复制
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数字会产生以下可能性:

代码语言:javascript
复制
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位:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32119306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档