obtener un entero sin signo de 32 bits. Voltee todos los bits (0->1 y 1->0) y devuelva el resultado como un número entero sin signo.
Tome 1, por ejemplo, como 32 bits sin signo es 0000000000000000000000000000000001 y al voltear obtenemos 111111111111111111111111111111110 que a su vez es 4294967294.
Puedo convertir un número decimal en binario, pero no contiene 32 bits para voltear. Por favor, ayúdame con esto.
Esto es en gran medida un problema básico de programación; y cualquier persona que publique código que utilice el manejo de cadenas no es alguien de quien quiera aprender.
Dicho esto, pack() es una excelente función; pero no ayuda a comprender exactamente lo que está sucediendo.
Para invertir un valor de 32 bits; pensemos en un int en PHP. En primer lugar, los int son de 64 bits; pero eso está bien; también podemos usar máscaras para asegurarnos de obtener la respuesta esperada (incluso si PHP cambia el ancho int predeterminado).
$value = some_int_value; // the value to invert $value = !$value; // flip all 64 bits $value = $value & 0xffffffff; // ignore anything but the last 32 bitsO más sucintamente
$invert_32_unsigned = 0xffffffff & !intval($value);Lo hice gracias a todos. Así es como lo hice.
$function flippingBits($n) { $binary = sprintf('%032b', $n); $fliped = strtr($binary, [1,0]); return bindec($fliped); }Para PHP, puede usar decbin y bindec para decimal a binario y binario a decimal respectivamente, y usar una función simple para invertir los bits.
Hice una función xinvert para hacer el trabajo, de la siguiente manera:
<?php $value1=10; echo xinvert($value1) ."<br>"; function xinvert($value1){ $string1= sprintf( "%032d",decbin($value1)); $index=0; $string2=""; while ($index < strlen($string1) ) { if (substr($string1, $index,1)=="0"){ $string2.="1"; }else{ $string2.="0"; } $index++; } return bindec($string2); } ?>Nota: He usado sprintf( "%032d",decbin($value1)); para que tenga una longitud de 32 bits , que está inspirado en user3783243