Operation sur bits

Bonjour,
Au sein d'un octet j'aimerais permuter un bit en décalant les autres bits.
Par exemple je travaille sur l'octet suivant:
B11000011
J aimerais que le bit 0 le plus faible prenne la place du bit 5 en décalant les autres vers la droite pour obtenir:
B11100001
Merci pour votre aide

Bonjour,

L'énoncé du problème manque un peu de précision.
On décale sur la droite les 8 bits et on insert le bit de poids faible qui est sortie, ou bien on fait la rotation uniquement sur les 6 bits de poids faible

Bonjour,

Dans ton exemple le bit 0 prend la place du bit 7.

Exprimé ainsi, il y a moins d'ambiguité:

B7B6B5B4B3B2B1B0 --> B7B6B0B5B4B3B2B1

Est-ce cela?

Que sait-tu sur la manipulation de bits?
Il faut partir du nombre de départ mot N°0, le décaler (mot N°1), récupérer un mot ou le bit 0 est mis en bonne place par décalage du mot 0 (mot n°2), masquer les trois mots N°0, N°1, N°2 pour ne garder que les bits intéressants, puis les assembler par un OU.

On peut voir cela alors comme Une rotation à droite d’un bit sur les 6 bits de poids faible sans toucher aux 2 bits de poids fort

Oui, il faut :
isoler les bits de 5 à 0 avec un & 0b00111111 dans une variable B5_0,
décaler B5_0 d'une position sur la droite (>>1),
reprendre la valeur de base B7_0 en isolant le bit 0 avec un &00000001 dans B_0,
ajouter B0 décalé de 5 (<<5) à B5_0
ajouter B_5 à (B7_0 & 0b11000000).

Excellent!

Cordialement
jpbbricole

Pour être un peu tatillon :wink: De manière générale il ne faudrait pas ajouter mais forcer l’écriture de ce bit. (Ici on est sûr qu’il y a un zéro dans ce bit de par les manipulations précédentes donc ajouter va fonctionner)

Bonjour J-M-L

Non, pas du tout, il faut être rigoureux dans ce genre de "sport" :blush:

Cordialement
jpbbricole

J'ai jamais dit B7B6B5B4B3B2B1B0, j'ai dit B7B6B5B4B3B2B1B0! Il faut être rigoureux[...]

les joies du "quote" qui perd le format..

Oui enfin on est arrivé au #10 et pour l'instant on perd notre temps dans des spéculations car el_gringo n'a toujours pas répondu à la question posée dès le #2

Bonjour pardonnez moi pour ma réponse tardive. Bonne interprétation au point #4. Je veux arriver à cela. Du coup je vais suivre la démarche de jppbricole. Merci à tous

du coup voila ce que je trouve. je pense que cela est correct.

byte  B_5, B_0;
byte B_7=B11000001; // trouver B11100000 Bit0 a la place du Bit5

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  B_0=(B_7& (1<<0))<<5; // VALEUR DU BIT 0 DECALE DE 5
  
  B_5=(0b11000000&B_7)|B_0|(((0b00011111)&(B_7))>>1); 
  
 
  LireOctet(B_5);
  delay(1000);
  
}
void LireOctet(byte Vecteur) {

for (int ii = 0; ii < 8; ii++) {
        if (Vecteur & (B10000000 >> ii)) {
             Serial.print(1);
            }
        else {
              Serial.print(0); 
            }
        }
}

Qui c'est?

Pour le code de loop, cela me semble bon, on peut difficilement faire mieux. Les noms ne sont pas forcément bien choisis, par exemple B_7 aurait mieux fait de s'appeler byteDeDepart
Sinon pour afficher un nombre binaire, on peut faire
Serial.print(B_5, BIN);

A mon avis il y a une petite erreur ici:
B_5=(0b11000000&B_7)|B_0|(((0b00011111)&(B_7))>>1);
Ce devrait être
B_5=(0b11000000&B_7)|B_0|(((0b00111111)&(B_7))>>1);

plus simplement
octet=(octet&0b11000000)|((octet&0b00111111)>>1)|((octet&0b00000001)<<5);

Bien vu Kamill. Merci encore à tous.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.