Question d'entretien : Explication de l'idée d'implémentation de l'inversion des bits binaires (version générale PHP)

angryTom
Libérer: 2023-04-07 16:08:01
avant
4785 Les gens l'ont consulté

Il s'agit d'une question d'entretien, et certains étudiants ont exprimé qu'ils ne pouvaient pas la comprendre. Il n'est pas difficile de vous donner une formation simple, mais d'écrire une comparaison parfaite teste les compétences de base et nécessite également une certaine capacité de réflexion logique. Puisque la direction des étudiants est PHP, j'utiliserai également PHP pour l'expliquer. le temps, cela dit aussi à tout le monde qu'apprendre PHP n'est pas On dit que tant que vous pouvez écrire deux phrases d'écho "hello world", ou une sortie en boucle sur une page Web, vous pouvez appeler PHP.

Il y a quelques connaissances à compléter : (Apprentissage recommandé : Tutoriel vidéo PHP)

1 , un nombre occupe un octet, soit 8 bits

Par exemple, le nombre décimal 1 est exprimé en binaire sur l'ordinateur sous la forme 00000001 (Si vous oubliez de convertir le décimal en binaire, s'il vous plaît Baidu, ce Oubliez que vous ne pouvez pas comprendre ce qui suit~~~)

Vous pouvez utiliser en PHP

echo bindec("00000001");   //bindec函数可以让你体会到 二进制和10进制之间的 骚转换<br/>
Copier après la connexion

2 Ajoutez des nombres décimaux 1+1 =2 (Cette astuce est très importante. ~~ , comprenez-le bien)

Utilisez le binaire pour le faire avec déplacement

Réponse : 00000010 C'est exactement 2 (2 à la puissance 1)

Et le nombre décimal 2+1=3 ?

Réponse : 00000011 Cela fait exactement 3 (2 à la puissance 1 + 2 à la puissance 0 = 2+1=3)

Qu'en est-il du nombre décimal 3+1=4 ?

Réponse : 00000100 Cela fait 4 (2 à la puissance 2)

Alors, qu'en est-il du nombre décimal 4+1=5 ?

Réponse : 00000101 Cela fait 4 (2 à la puissance 2 + 2 à la puissance 0 = 4 + 1 = 5)

Commencez à résoudre le problème

Supposons qu'il existe un nombre binaire 00000101. Nous devons maintenant le retourner et le transformer en 10100000. Comment jouer ?

Les réponses sont partout sur Internet, alors voici l'idée :

1. D'abord, il doit y avoir 2 variables,

. 1 ) La variable temporaire s'appelle $xxoo et la valeur initiale est 0 (décimal), ce qui en binaire est 00000000

2) La variable de valeur d'origine s'appelle $shit, qui doit être traitée 00000101

2. 3 étapes

1) Déplacer $xxoo vers la gauche d'une position

2) Déterminer si le dernier chiffre de la valeur binaire de $ merde est 1. Si c'est le cas, donnez $ La valeur décimale de xxoo est augmentée de 1. Il est très important de la considérer comme binaire et de changer 00000000 en 00000001. Sinon, la valeur initiale de $xxoo est 00000000. Elle est décalée de p . . . Ils sont tous nuls, alors comment déterminer si le dernier bit du nombre binaire est 1 ? Vous devez juger en interceptant des chaînes ou des expressions régulières (ce n'est pas impossible)

Réponse : Effectuez simplement une opération logique ET sur la valeur d'origine et 1 (c'est-à-dire 00000001) (1&1 est 1, 1&0 ou 0&1 sont toujours 0)

3) Ensuite, déplacez $shit vers la droite d'une position

1) S'il s'agissait à l'origine de 00000101, cela devient 00000010 après le déplacement ( C'est-à-dire que $xxoo et la merde sont déplacés en même temps, un vers la gauche et un vers la droite. Quand le dernier morceau de merde est 1, on peut le juger, donc le dernier morceau de merde $xxoo est également défini sur 1, afin que xxoo et shit puissent être réalisés. La synchronisation est inversée)

Répétez le processus ci-dessus 8 fois pour obtenir 10100000

Le code complet est. comme suit

function rev($n)<br/>{<br/>    $xxoo = 0;<br/>    for ($i = 0; $i < 8; $i++) {<br/>        $xxoo = $xxoo << 1;<br/>        if (($n & 1) == 1) {<br/>            $xxoo++;<br/>        }<br/>        $n = $n >> 1;<br/>    }<br/>    return $xxoo;<br/>}<br/>echo decbin(rev(5));<br/>
Copier après la connexion

Mais soyez prudent Le fait est que la fonction ci-dessus prend en charge les nombres à 1 octet (ne prend en charge que 8 chiffres)

Les questions d'entretien en ligne sont Numéros 32 bits, et le code suivant prend en charge les chiffres universels (Ce code n'est pas disponible en ligne~~~). Réfléchissons-y et comprenons-le, donc je n'expliquerai pas trop. Vous devez avoir quelques compétences en code PHP :

function rev($n)<br/>{<br/>    $num=intval(strlen(decbin($n))/8); //整除 8<br/>    if($num==0)<br/>        $bitLen=8;//最小8位<br/>    else<br/>    {<br/>        if((strlen(decbin($n)) % 8)>0)<br/>            $bitLen=($num+1)*8;<br/>        else<br/>            $bitLen=$num*8;<br/>    }<br/>    echo “原始值二进制:”.str_pad(decbin($n),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br/>    $xxoo = 0;<br/>    for ($i = 0; $i < $bitLen; $i++) {<br/>        $xxoo = $xxoo << 1;<br/>        if (($n & 1) == 1) {<br/>            $xxoo++;<br/>        }<br/>        $n = $n >> 1;<br/>    }<br/>    echo “反转后值二进制:”.str_pad(decbin($xxoo),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br/>    return $xxoo;<br/>}<br/>
Copier après la connexion

Call test

echo rev(4);<br/>echo rev(43261596);<br/>
Copier après la connexion

Résultat

原始值二进制:00000100<br/>反转后值二进制:00100000<br/>32原始值二进制:00000010100101000001111010011100<br/>反转后值二进制:00111001011110000010100101000000<br/>964176192<br/>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:www.hishenyi.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!