(検索アルゴリズムでの作業)16ビットワードに設定された2つのビットを使用して、可能な一致を繰り返し処理したいと考えています。現在は過度に複雑なソリューションでは愚かな問題のようです。どのように16ビットintの2つのビットセットの数値シリーズを取得するには?
反復が(10進数)を返す必要があり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