(在搜索算法上工作)我想遍历在16位字中设置的两位可能的匹配。对于目前过于复杂的解决方案来说,这看起来像一个愚蠢的问题。如何获得一个16位整数的两位数的序列号?
迭代应该返回(十进制)3,5,6,9,10,12,17 ...
什么是对这个问题的正确的字?位掩码套住? 任何聪明的功能呢?
当前的代码 - 现在已更新: (按照现在的情况,我想没有解决这个没有更简单的方法)
<?php
function biterate($numBits=8, $setBits=2, $maxval=null) {
//init
if(is_null($maxval)) $maxval = (pow(2,$setBits)-1) * pow(2,$numBits - $setBits);
$err = 0;
header('content-type:text/plain');
echo '-- ' . $setBits . ' of ' . $numBits . " --\r\n";
$result = str_pad('', $numBits - $setBits, '0') . str_pad('', $setBits, '1');
do {
$err++;
if($err > 200) die('bad code');
//echo and calc next val.
echo $result . ' : ' . bindec($result) . "\r\n";
//count set bits and search for '01' to be replaced with '10'. From LSB.
$bitDivend = '';
$hit = false;
for($i=$numBits;$i>0;$i--) {
if(substr($result,$i-2,2) == '01') {
$hit = true;
//do the replacement and replace the lower part with bitDivend.
$result = substr($result, 0, $i-2) . '10';
$result .= str_pad('',$numBits - $i - strlen($bitDivend),'0');
$result .= $bitDivend;
//exit loop
$i = 0;
}
if($result[$i-1] == '1') $bitDivend .= '1';
}
} while($hit && bindec($result) <= $maxval);
}
biterate(8,2);
biterate(8,7);
biterate();
和你目前的,不聪明/任何代码是? –
@MarcinOrlowski above .. – Teson