假设我有十进制格式的数字:5
其二进制版本为:00101
我想写一个带十进制数x
并返回与原始数字差异(以二进制形式表示)的所有其他十进制数字:
所以对于上面的例子,邻居是:
10101 01101 00111 00001 00100
,相应的小数为:
21 13 7 1 4
我想要一个计算效率高的解决方案,即使我已经说了一百万个数字也不需要很长时间。
这可能吗?
答案 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