0
votes

Ré-indexation des bits dans un char

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> xxx pré>

le binaire pour H est p>

01000001


4 commentaires

Qu'en est-il du premier bit?


Dans le nombre 64752031 est le 6 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?


4 Réponses :


1
votes

Utiliser des opérateurs bitwises.

Voici un exemple de comment déplacer le deuxième bit au septième bit: xxx

si mon numéro de numéro de bit gonhy, je suis Pardon. C'est juste comment j'ai lu les nombres binaires.

Vous pouvez également la mettre dans une fonction inline: xxx


2 commentaires

OP n'essaie pas d'échanger des bits.


J'ai deux versions, que devrais-je utiliser?



1
votes

Déplacez simplement les bits aux positions appropriées. Après un peu de plaisir, je pense avoir ceci:

0x48 0x41


6 commentaires

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 dans bit0 = 6; bit1 = 4; bit2 = 7; bit3 = 5; ... (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 est un non signé long < / code> variable. Donc, j'ai besoin d'extraire les chiffres de l'entier 64752031 , c'est pourquoi, par exemple pour 7 , j'ai besoin de diviser par 1000000 , je reçois 647 , alors je fais mod par 10 et je reçois 7 .



3
votes

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


5 commentaires

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]]; } La boucle s'arrêtera lorsque avant [i] == '\ 0' (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'; ).


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] si avant est la chaîne à convertir et i < / code> l'index de la boucle.



1
votes

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


1 commentaires

Y a-t-il un moyen d'inverser ce codage? Comme quelle serait la version décodée?