C++ et opérations sur les bits

Bouille_ Messages postés 4 Date d'inscription jeudi 7 août 2014 Statut Membre Dernière intervention 24 août 2014 - 24 août 2014 à 10:55
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 24 août 2014 à 12:21
Bonjour,
et merci de votre aide,

je recherche un manière simple en c++ d'effectuer des permutations de BIT entre deux variables,
J'aimerai bien m'affranchir de séries de décalage et comparaison pour y parvenir.
n'existe t'il pas une commande plus simple
j'ai bien tenté avec
std::bitset;


Mais je n'y parviens pas.

par exemple, si j'ai deux variables:
A=247 soit ( 11110111 en binaire)
B=154 soit ( 10011010 )
( je considère que le premier bit est celui le plus a gauche )

je souhaiterai mettre le 4eme bit de A à la place du 2nd bit de B et ainsi obtenir ( B= 11011010 en binaire ), et mettre le dernier bit de B à la place du premier bit de A et ainsi obtenir ( A = 01110111 ).

existe t'il une méthode simple, car je suis en train se sécher avec std::bitset ou autre.

Merci de votre aide.

Hervé

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
24 août 2014 à 12:21
Bonjour.

Quelques bases à apprendre:
- Non, on n'échappe pas aisément à l'arithmétique binaire quand on veut faire de l'arithmétique binaire !
- On numérote de la droite vers la gauche (imagine que tes deux variables n'aient pas la même taille, tu ferais comment en numérotant par la gauche ?)
- Un décalage commence à 0 pour la position 1 (Un décalage de 0 se trouve à la position 1).
- Pour décaler un bit vers la gauche on écrit: 1 << 1, pour décaler de deux bits: 1 << 2, etc...

Ensuite:
* Vérifier si le bit x est "allumé": bit = nombre & (1 << x);
* Mettre le bit x à 1: bit = nombre | (1 << x);
* Mettre le bit x à 0: bit = nombre & ~(1 << x); (Le ~ inverse tous les 0 et 1. On met donc ici tout à 1, sauf le dernier bit (de gauche) de x, ainsi rien ne change, sauf le bit le plus à gauche).

Appliqué à ton exemple:
- On récupère le 5ème bit de a: bit = a & (1 << 4)
- On regarde ensuite si celui-ci vaut 0 ou 1.
- Si ça vaut 1, on met le bit 7 de b à 1: b = b | (1 << 6)
- Si ça vaut 0, on met le bit 7 de b à 0: b = b & ~(1 << 6)

Ce qui donne:
#include <iostream>

int main()
{
  int a = 247; // 1111 0111
  int b = 154; // 1001 1010

  //int a = 231; // 1110 0111
  //int b = 218; // 1101 1010

  int fifth_bit_of_a = a & (1 << 4);

  int apply_to_b;
  if (fifth_bit_of_a)
    apply_to_b = b | (1 << 6);
  else
    apply_to_b = b & ~(1 << 6);

  std::cout << "a=" << a << "\n"
            << "b=" << b << "\n"
            << "5th bit of a = " << fifth_bit_of_a << "\n"
            << "res=" << apply_to_b << std::endl;

  return 0;
}


__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Rejoignez-nous