2017-05-04 68 views
2

(在搜索算法上工作)我想遍历在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(); 
+0

和你目前的,不聪明/任何代码是? –

+0

@MarcinOrlowski above .. – Teson

回答

1

如果你只是想所有设定的2位的16位整数,下面的代码应该这样做:

<?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 

等。您只需将外部循环的每次迭代中最重要的位移到左侧(另一个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

相关问题