bonjour,
Pourriez-vous m'aider car en effet, je n'arrive pas a créer une permutation sur 8 bits de la manière suivante:
b7 b6 b5 b4 b3 b2 b1 b0 <- bits initiaux
b4 b5 b6 b7 b0 b1 b2 b3 <- ordre de bits voulu
Merci d'avance pour votre aide,
MilyBass
bonjour,
Pourriez-vous m'aider car en effet, je n'arrive pas a créer une permutation sur 8 bits de la manière suivante:
b7 b6 b5 b4 b3 b2 b1 b0 <- bits initiaux
b4 b5 b6 b7 b0 b1 b2 b3 <- ordre de bits voulu
Merci d'avance pour votre aide,
MilyBass
Bonjour et bienvenue,
Il n'y a pas de façon « simple » de le faire (en une seule opération), mais tu peux t'en sortir en quatre étapes avec un ET logique « & », les opérateurs de décalage « << » et « >> » et le OU logique « | ». Tu peux manipuler deux bits à chaque étape.
Est-ce un devoir scolaire ?
Non, c'est un test.
Je suis en alternance et sur mon projet j'avais nécessité de faire cette fonction mais mes connaissances sur les masques et le C sont limités.
— Le masque ET te permet de ne conserver que les bits qui sont à 1 dans les deux opérandes et par conséquent, c'est l'équivalent d'une « intersection » mathématique. « 10001000 » en binaire s'écrit 0x88 en hexadécimal. Ainsi « n & 0x88 » est une expression qui ne renvoie que les bits 7 et 4 de n (sans modifier la variable) ;
— L'opérateur de décalage permet de déplacer les bits d'un registre d'un certain nombre de positions à gauche ou à droite. Donc « n >> 1 » déplace tous les bits de n vers la droite. Attention au signe ! Si n est naturellement non signé, l'opérateur insérera un zéro par la gauche, sinon le bit de poids fort restera intact. En appliquant cet opérateur à l'expression entière ci-dessus (avec des parenthèses si nécessaire), les bits 7 et 4 se retrouvent en position 6 et 3 ;
— Le masque OU te permet ne conserver que les bits qui sont à 1 dans l'une ou l'autre des opérandes, ou les deux. Par conséquent, c'est l'équivalent d'une « union » mathématique. Tu peux t'en servir pour superposer tous les résultats de tes opérations intermédiaires.
Merci pour ces explications, je vais essayer de partir dans cette direction en procédant de la même manière pour tout les bits
Mais toutefois, un doute plane: les masques...![]()
Challenge accepted
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int main(void) { unsigned char a = 85; a = ((a & 0x01) << 3) + ((a & 0x02) << 1) + ((a & 0x04) >> 1) + ((a & 0x08) >> 3) + ((a & 0x10) << 3) + ((a & 0x20) << 1) + ((a & 0x40) >> 1) + ((a & 0x80) >> 3); printf ("%d\n", a); return (0); }patapay
C'est bien ce que je disais : ce n'est pas en une opération, même si le tout tient en une seule expression. Il faut extraire chaque paire de bit et les décaler individuellement (au passage, tu aurais pu utiliser moitié moins de lignes)
C'est surtout que ça ne lui rend pas vraiment service : l'objectif était de l'aider à trouver la solution seule, pas de faire son travail à sa place.patapay
C'est plus clair avec un schéma :
001110110010 soit 0x3B2 ↓↓↓↓↓↓↓↓↓↓↓↓ & 011011011101 soit 0x6DD --------------- = 001000010000 soit 0x210
Dans cette opération ET, on compare les bits deux à deux et on ne conserve que ceux qui sont à 1 des deux côtés.
Ah ... J'ai confondu "une seule opération" et "une seule expression".
Du coup ... je ne vois pas, dans l'état actuelle de mes connaissance, comment on pourrait faire cela en une seule opération.
Et oui, j'ai fait l'exemple a la va vite sasn reflexion, donc il y avait la place pour faire mieux :
Ben c'est vrai que j'aurai dû écrire ce que tu as écrit juste après mon message pour expliquer ce que j'ai fait, mais au final, tes explications sont très clair et l'exemple que j'ai donné (aussi mauvais soit-il) est finalement comprehensible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main(void) { unsigned char a = 85; a = ((a & 0x11) << 3) + ((a & 0x22) << 1) + ((a & 0x44) >> 1) + ((a & 0x88) >> 3); printf ("%d\n", a); return (0); }
Partager