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) ;
}