yphastos
8/2/2017 - 7:34 PM

equal Pair Of Bits

equal Pair Of Bits

// ok:
// nota que el codigo es identico a el ejercicio 'different Rightmost Bit', simplemente cambiando la condicion del if
function equalPairOfBits($n, $m) {
  return call_user_func(function($n,$m){
    $na = str_split(strrev(str_pad(decbin($n),32,'0',STR_PAD_LEFT)));
    $ma = str_split(strrev(str_pad(decbin($m),32,'0',STR_PAD_LEFT)));
    for($i = 0; $i <32; $i++){
      if($na[$i] == $ma[$i]){
        return pow(2,$i);
      }
    }
  }, $n,$m); ;
}


// test: no funciona porque se detiene en el primer bit que NO coincida de izq a der.
// pero el resultado esperado es el no coincida pero de der a izq.

function equalPairOfBits($n, $m) {
  return call_user_func(function($n,$m){
    $na = str_split(($ns = str_pad(decbin($n),32,'0',STR_PAD_LEFT)));
    $ma = str_split(($ms = str_pad(decbin($m),32,'0',STR_PAD_LEFT)));
    echo "$ns\n$ms\n";
    echo "12345678911234567892123456789312"."\n";
    echo "13987654321298765432119876543210";
    for($i = 0; $i <32; $i++){
      if($na[$i] != $ma[$i]){
        echo ",".$i;
        return pow(2,(32-$i));
      }
    }
    return 1;
  }, $n,$m); ;
}

// other solutions:

function equalPairOfBits($n, $m) {
  return pow(2, strcspn(strrev(sprintf('%032b', $n)) ^ strrev(sprintf('%032b', $m)), "\0")) ;
}

function equalPairOfBits($n, $m) {
  return (( $n ^ $m ) + 1) & ( ~ ( $n ^ $m ) );
}

function equalPairOfBits($n, $m) {
  return ~($n ^ $m) & -~($n ^ $m) ;
}