2017-05-04 6 views
2

(検索アルゴリズムでの作業)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(); 
+0

あなたの現在の、巧妙ではない/どんなコードですか? –

+0

@MarcinOrlowski above .. – Teson

答えて

1

あなただけの設定2ビットがすべて16ビットのint型、次のコードをしたい場合それを行う必要があります:あなたは数字のビットパターンを見れば

<?php 
for($i=1;$i<16;$i++) 
{ 
    for($j=0;$j<$i;$j++) 
    { 
     echo (1<<$i)|(1<<$j) , "\r\n"; 
    } 
} 
?> 

をあなたはそれがどのように動作するかを見ることができます:

11 3 

    101 5 
    110 6 

1001 9 
1010 10 
1100 12 

10001 17 
10010 18 
10100 20 
11000 24 

などです。外側ループの各反復で最も重要なビットを1つ左の位置(別の2の累乗)だけ移動させ、内側ループの内側で最下位ビット(1)から1つの位置まで反復します最上位ビットの右。

あなたはビットと場所の任意の数をサポートするために、これを一般化したい場合は、再帰を使用して、上記のアルゴリズムを拡張することができが:

<?php 
function biterate_recursive($numBits=8, $setBits=2, $initialValue=0, $maxval=null) { 
    for($i=$setBits-1;$i<$numBits;$i++) 
    { 
     if(!is_null($maxval) && ($initialValue|(1<<$i)) > $maxval) 
      break; 

     if($setBits==1) 
      echo $initialValue|(1<<$i) , "\r\n"; 
     else 
      biterate_recursive($i, $setBits-1, $initialValue|(1<<$i), $maxval); 
    } 
} 

biterate_recursive(16, 2); 
?> 

また、単に組み合わせ、すなわちCを(選択するなどの問題を考えることができます16,2)集合0-15から2つの数a、bを選び、(1<<a)|(1<<b)を計算する。しかし、順番に番号を取得する場合は、組み合わせアルゴリズムの選択に注意する必要があります。

+0

ありがとう、これは素晴らしいコードです。 (そして、まだCを学ぶ理由の素晴らしい例)。 – Teson

関連する問題