J'ai un exercice où je dois coder et décoder des chaînes au niveau du bit qui sont donnés dans la ligne de commande.
La mise en garde à ceci est que je dois utiliser une cartographie de permutation pour commander les bits . P>
Voici un exemple: p>
L'utilisateur entrait le caractère pour coder p> le binaire pour H est p> 01000001
4 Réponses :
Utiliser des opérateurs bitwises.
Voici un exemple de comment déplacer le deuxième bit au septième bit: p> si mon numéro de numéro de bit gonhy, je suis Pardon. C'est juste comment j'ai lu les nombres binaires. P> Vous pouvez également la mettre dans une fonction inline: p>
OP n'essaie pas d'échanger des bits.
J'ai deux versions, que devrais-je utiliser?
Déplacez simplement les bits aux positions appropriées. Après un peu de plaisir, je pense avoir ceci:
0x48 0x41
Whoa. Ne pensez-vous pas que vous devriez donner des indices au lieu de simplement donner la réponse complète?
Eh bien, il y a même quelque chose Meta dessus. Je pense, il serait certainement agréable d'encourager d'autres personnes, notamment à trouver une solution en lui donnant des allusions. Je viens de cela comme un défi amusant et j'ai procédé à le résoudre. Mais je pense que je suis d'accord avec "un indice est par définition intentionnellement de fournir une réponse à la question". À la question "Y a-t-il un moyen ...?" - Je réponds: oui et pour le prouver, voici un exemple de façon de le faire.
Pensez-vous que vous pourriez expliquer pourquoi vous avez le BIT0 CONST INT à travers BIT7 MODDED par 10 pour chacun des morts?
JL2210, c'est d'un livre de pratique que je lis depuis l'été
@gooddayjay J'aime ceux-ci, surtout quand ils offrent un peu de difficulté.
@ gourddayjay j'ai besoin de convertir 64752031 code> dans
bit0 = 6; bit1 = 4; bit2 = 7; bit3 = 5; ... code> (cela pourrait être un tableau;)), à savoir. extraire des nombres aux positions des décimales. Parce que j'ai choisi pour que l'entrée soit juste un numéro entier (vous n'avez pas spécifié le format d'entrée. Une chaîne? Un tableau de chiffres?) J'ai supposé que le
64752031 code> est un
non signé long < / code> variable. Donc, j'ai besoin d'extraire les chiffres de l'entier code> 64752031 code>, c'est pourquoi, par exemple pour
7 code>, j'ai besoin de diviser par
1000000 code>, je reçois
647 code>, alors je fais mod par
10 code> et je reçois
7 code>.
Si vous avez besoin de traiter de grandes chaînes, il est probablement préférable d'utiliser une table de recherche qui précalcule la traduction.
#include <stdio.h> unsigned char perm[256]; // permutation table unsigned mapping[8]={6,4,7,5,2,0,3,1}; // assumes 7 6 5 4 3 2 1 0 // => 6 4 7 5 2 0 3 1 void mkperm(unsigned char perm[256]) { for (int i=0; i<256; i++) perm[i]=0; for (int i=0;i<256;i++) { for (int j=7; j>=0; j--) { int pos=mapping[7-j]; // at mapping[0] is the new position of bit 7 if (i & (1<<j)) // only considers set bits, the table is previously cleared perm[i] |= (1<<pos) ; } } } int main() { mkperm(perm); printf("%.2x => %.2x\n",'H',perm['H']); }
Grande approche. Quelque chose que je n'ai jamais pensé vraiment.
Y a-t-il un moyen possible d'entrer une chaîne plus grande puis "h"? Comme si je voulais saisir une phrase, comment cela pourrait-il être fait?
Il suffit de boucler sur les caractères de votre chaîne et de convertir chaque caractère rencontré. Supposons que vous souhaitiez transformer une chaîne "avant" pour "après". Vous devez juste faire int i; pour (i = 0; avant [i]; i ++) {après [i] = perm [avant [i]]; } code> La boucle s'arrêtera lorsque
avant [i] == '\ 0' code> (chaîne terminée null) et chaque char de "après" obtiendra une version permutée du caractère correspondant " avant 'Merci à la table de recherche' Perm '. N'oubliez pas d'ajouter une terminaison '\ 0' à la fin de "après" (
après [i] = '\ 0'; code>).
Je comprends que, cependant, lorsque vous êtes à la ligne 23, vous faites un imprimeur ("%. 2x =>>% .2x \ n", 'h', perm ['h']); qui imprime une "H" permanente. Comment imprimeriez-vous la déclaration avec des cordes plus grandes?
Inclure le printf () dans une boucle et remplacez les deux «H» dans le printf par avant [i] code> si
avant code> est la chaîne à convertir et
i < / code> l'index de la boucle.
Si j'ai bien compris l'ordre des bits, car vous les comptez, la fonction correspondante peut regarder la manière suivante comme indiqué dans le programme de démonstration.
c = 48 c = 41
Y a-t-il un moyen d'inverser ce codage? Comme quelle serait la version décodée?
Qu'en est-il du premier bit?
Dans le nombre
64752031 code> est le
6 code> au moins significatif ou le plus significatif? Comment interpréter la cartographie?
Le 0ème bit serait désormais le 6ème du binaire pour le Char 'h'. Donc, ce serait le 6ème bit serait maintenant le premier bit
@gooddayjay Un de plus est un peu moins important du personnage? En d'autres termes, vous comptez des bits de gauche à droite ou de droite à gauche?