Comment inverser les bits d'un octet?
Par exemple, en PHP, comment pourrais-je inverser les bits de l'octet 11011111
à 11111011
?
- eh bien, dans ce cas, tourner à droite en 5 positions 😛
- Votre question a besoin d'un peu plus de précisions. Par exemple, est-ce une chaîne ou un entier dont les bits que vous essayez de flip? Le contexte est très important lorsque vous posez une question.
- lol, vous avez failli m'a fait cracher mon café sur mon clavier =P
- +1 pour Kletz, mais pour ce cas vous pouvez faire beaucoup plus simple chose: attribuer avec 0b11111011 valeur (pour certaines architectures, il pourrait être beaucoup plus efficace 😉 ).
- oui, le vôtre est beaucoup plus simple XD
Vous devez vous connecter pour publier un commentaire.
La droite de l'avant l'approche est d'effectuer 8 masques, 8 tourne, et 7 ajouts:
(128&n)>>7|(64&n)>>5|(32&n)>>3|(16&n)>>1|(8&n)<<1|(4&n)<<3|(2&n)<<5|(1&n)<<7
Si vous avez déjà les bits sous la forme d'une chaîne de caractères, utilisez strrev.
Si pas, convertissez d'abord l'octet de sa représentation binaire en utilisant decbin, puis en sens inverse à l'aide de strrev, puis revenir à l'octet (si nécessaire) à l'aide de bindec.
Voir la section sur l'inversion de séquences de bits dans Peu Se Tourner Les Hacks. Doit être facile à adapter l'une des techniques en PHP.
Bien que probablement pas pratique pour PHP, il y a de particulièrement fascinant, une aide de 3 64bit opérations:
Le moyen le plus rapide, mais aussi le seul nécessitant plus d'espace est un lieu de recherche, dans lequel chaque valeur possible d'un octet (256, si vous allez pour l'ensemble de la gamme), est associé à son "inversé" équivalent.
Si vous avez seulement quelques octets à traiter, des opérateurs bit par bit vais faire, mais qui sera plus lent, peut-être quelque chose comme:
C'est O(n) avec la longueur de la mèche. Il suffit de penser de l'entrée comme une pile et d'écrire sur la sortie de la pile.
Ma tentative de l'écriture de ce en PHP.
Essayez de vous procurer ce livre, il y a tout le chapitre sur les bits de réversion:
Hacker Plaisir. Mais s'il vous plaît vérifiez d'abord du contenu, si cela vous convient.
Certaines personnes ont été suggérant une table de recherche, alors que j'ai été faire un:
Et voici une version en caractères:
Je suis en désaccord avec l'aide d'une table comme (pour de plus grands nombres entiers) la quantité de temps nécessaire pour le charger en mémoire l'emporte sur les performances de traitement.
J'ai aussi utiliser un bit à bit de masquage approche pour un O(logn) solution, qui ressemble à:
L'avantage de cette approche est qu'il gère la taille de votre entier comme un argument
en php ce qui pourrait ressembler à:
à moins que j'ai foiré mon php quelque part 🙁