选择十进制数的所有二进制邻居

时间:2015-06-28 19:08:34

标签: r binary decimal

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

其二进制版本为:00101

我想写一个带十进制数x

的函数

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

所以对于上面的例子,邻居是:

10101 01101 00111 00001 00100

,相应的小数为:

21 13 7 1 4

我想要一个计算效率高的解决方案,即使我已经说了一百万个数字也不需要很长时间。

这可能吗?

3 个答案:

答案 0 :(得分:10)

我不知道试验和错误是如何让我在这里的,但它看起来有效,除非我弄乱了二进制和小数:

bin_neighs = function(x, n) bitwXor(x, (2 ^ (0:(n - 1))))
bin_neighs(5, 5)
#[1]  4  7  1 13 21

答案 1 :(得分:1)

我认为您正在询问如何将数字5作为输入并返回所有相邻的二进制值。为此,您需要将数字转换为有用的二进制格式(只需要翻转的位),翻转每一位,然后返回结果:

library(R.utils)
bin.neighbors <- function(x, num.neighbors=NA) {
  # Get the bits with the appropriate amount of padding
  bits <- as.numeric(unlist(strsplit(intToBin(x), "")))
  if (!is.na(num.neighbors) & num.neighbors > length(bits)) {
    bits <- c(rep(0, num.neighbors-length(bits)), bits)
  }

  # Build a matrix where each column is a bit vector of a neighbor
  mat <- matrix(bits, length(bits), length(bits))
  diag(mat) <- 1-diag(mat)

  # Return the decimal values of the neighbors using strtoi
  apply(mat, 2, function(x) strtoi(paste0(x, collapse=""), 2))
}
bin.neighbors(5, 5)
# [1] 21 13  1  7  4

因为每个数字都有许多前导0的不同数量的二进制表示(例如5可以表示为101,0101,00101,000101,0000101等),我添加了一个参数num.neighbors来指定函数输出向量的长度。您可以传递NA以获得等于输入的二进制表示中的位数的输出向量,而不带前导零。

答案 2 :(得分:1)

这是使用<?php <script type = "text/javascript"> function view_side_lt() { global $_G, $postlist; $newlist = array(); $list = ''; if (is_array($postlist)) { foreach($postlist as $temp) { if ($temp['first'] == 1) { $query = DB::query("SELECT tid, subject FROM ".DB::table('forum_thread'). " where authorid = '".intval($temp[' authorid '])."' and tid < > '".intval($temp[' tid '])."' ORDER BY 'dateline' DESC LIMIT ".intval(5); while ($list_temp = DB::fetch($query)) { $listli = '<li> < a href = "forum.php?mod=viewthread&tid='.$list_temp['tid'].'" title = "'.$list_temp['subject'].' "target=" _blank ">'.cutstr($list_temp['subject'], 10, $dot = ' ...').'</a> </li>' }; $newlist[] = '$listli' return '$newlist'; } } } }; </script> <ul class="clearfix"> "{$newlist}" </ul> ?> 管道的另一种方式:

X
XX
XXX
XXXX