Format bianaire en C

Bonjour !

C'est une question toute simple, j'aimerais pouvoir affecter une variable C par une constante en binaire

genre j prenne la valeur binaire 1000100

Je sais que pour préciser que c'est en héxa on met 0x devant le nombre , en octal 0, mais en binaire ???

Merci
Julie

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Euh ben c'est sur cette page qu'il parlent des masques binaires, non ? Si tu peux faire du c++, tu peux essayer un std::vector<bool>, mais c'est moins pratique qu'une vraie variable binaire...

    Ceci dit j'ai cherché une notation en 0b et j'ai rien trouvé... à ce demander si ca existe ;o))

    Sinon tu ne peux pas travailler en hexa ?
    1. Ben oui je pourrais travailler en hexa mais bon ca me ferait quand meme plaisir de savoir comment préciser qu'une constante est binaire sans avoir à créer des structures... y'a surement moyen, c'est tout bete quand même...

      Julie
    2. @juliej'ai la solution...
      en fait, tu voudrais faire un truc du genre :

      int a = 0b11010101;

      qui pourrai s'écrire aussi :

      int a = 0xD5;

      ou

      int a = 213;

      mais bon ! apparement, tu tiens à utiliser le format binaire.
      voici donc 3 macro pour transformer des chaines binaires (respectivemnt 8, 16 et 32 bits).

      #define to8b( o ) ( (((#o[7] == 0x30) ? 0 : 1) << 0) | \
      (((#o[6] == 0x30) ? 0 : 1) << 1) | \
      (((#o[5] == 0x30) ? 0 : 1) << 2) | \
      (((#o[4] == 0x30) ? 0 : 1) << 3) | \
      (((#o[3] == 0x30) ? 0 : 1) << 4) | \
      (((#o[2] == 0x30) ? 0 : 1) << 5) | \
      (((#o[1] == 0x30) ? 0 : 1) << 6) | \
      (((#o[0] == 0x30) ? 0 : 1) << 7) )

      #define to16b( o )( (((#o[15] == 0x30) ? 0 : 1) << 0) | \
      (((#o[14] == 0x30) ? 0 : 1) << 1) | \
      (((#o[13] == 0x30) ? 0 : 1) << 2) | \
      (((#o[12] == 0x30) ? 0 : 1) << 3) | \
      (((#o[11] == 0x30) ? 0 : 1) << 4) | \
      (((#o[10] == 0x30) ? 0 : 1) << 5) | \
      (((#o[ 9] == 0x30) ? 0 : 1) << 6) | \
      (((#o[ 8] == 0x30) ? 0 : 1) << 7) | \
      (((#o[ 7] == 0x30) ? 0 : 1) << 8) | \
      (((#o[ 6] == 0x30) ? 0 : 1) << 9) | \
      (((#o[ 5] == 0x30) ? 0 : 1) << 10) | \
      (((#o[ 4] == 0x30) ? 0 : 1) << 11) | \
      (((#o[ 3] == 0x30) ? 0 : 1) << 12) | \
      (((#o[ 2] == 0x30) ? 0 : 1) << 13) | \
      (((#o[ 1] == 0x30) ? 0 : 1) << 14) | \
      (((#o[ 0] == 0x30) ? 0 : 1) << 15) )

      #define to32b( o )( (((#o[31] == 0x30) ? 0 : 1) << 0) | \
      (((#o[30] == 0x30) ? 0 : 1) << 1) | \
      (((#o[29] == 0x30) ? 0 : 1) << 2) | \
      (((#o[28] == 0x30) ? 0 : 1) << 3) | \
      (((#o[27] == 0x30) ? 0 : 1) << 4) | \
      (((#o[26] == 0x30) ? 0 : 1) << 5) | \
      (((#o[25] == 0x30) ? 0 : 1) << 6) | \
      (((#o[24] == 0x30) ? 0 : 1) << 7) | \
      (((#o[23] == 0x30) ? 0 : 1) << 8) | \
      (((#o[22] == 0x30) ? 0 : 1) << 9) | \
      (((#o[21] == 0x30) ? 0 : 1) << 10) | \
      (((#o[20] == 0x30) ? 0 : 1) << 11) | \
      (((#o[19] == 0x30) ? 0 : 1) << 12) | \
      (((#o[18] == 0x30) ? 0 : 1) << 13) | \
      (((#o[17] == 0x30) ? 0 : 1) << 14) | \
      (((#o[16] == 0x30) ? 0 : 1) << 15) | \
      (((#o[15] == 0x30) ? 0 : 1) << 16) | \
      (((#o[14] == 0x30) ? 0 : 1) << 17) | \
      (((#o[13] == 0x30) ? 0 : 1) << 18) | \
      (((#o[12] == 0x30) ? 0 : 1) << 19) | \
      (((#o[11] == 0x30) ? 0 : 1) << 20) | \
      (((#o[10] == 0x30) ? 0 : 1) << 21) | \
      (((#o[ 9] == 0x30) ? 0 : 1) << 22) | \
      (((#o[ 8] == 0x30) ? 0 : 1) << 23) | \
      (((#o[ 7] == 0x30) ? 0 : 1) << 24) | \
      (((#o[ 6] == 0x30) ? 0 : 1) << 25) | \
      (((#o[ 5] == 0x30) ? 0 : 1) << 26) | \
      (((#o[ 4] == 0x30) ? 0 : 1) << 27) | \
      (((#o[ 3] == 0x30) ? 0 : 1) << 28) | \
      (((#o[ 2] == 0x30) ? 0 : 1) << 29) | \
      (((#o[ 1] == 0x30) ? 0 : 1) << 30) | \
      (((#o[ 0] == 0x30) ? 0 : 1) << 31) )

      avec ça, tu peux maintenant écrire :

      int a = to8b(11010101);
      et si tu fais
      printf("a = %d", a);
      tu obtiendras à l'affichage a = 213

      Enjoy !
    3. @julieSalut julie

      Je viens aux nouvelles pour savoir si tu t'en sors avec ton format binaire en langage C.
  2. Modérateur
    1. salut ! je suis allé voir sur le forum que tu m'as indiqué mais nulle part est dit comment on précise qu'une constante est binaire ( si je ne suis pas aveugle ! )

      Julie
    2. Contributeur
      @julieBonjour,
      Tu as essayé avec 0b ??
    3. @Kermitt31oui, bien tenté mais ca ne marche pas...

      quant aux réponses des autres, leurs solutions ne sont pas vraiment adaptées, il faudrait que ce soit aussi simple que la proposition de Kermitt31...

      Alors Kermitt31 d'autres idées ?

      Julie
  3. Salut,

    typedef union myUnion{
    typedef struct myStruct{
    unsigned var1:1; //nombre de bits
    unsigned var2:1;
    unsigned var3:1;
    unsigned var4:1;
    unsigned var5:1;
    unsigned var6:1;
    unsigned var7:1;
    unsigned var8:1;
    }struct1;
    unsigned char octet;
    } union1;

    //tu definis bit à bit ta variable octet
    union1.var1 = 0;
    union1.var2 = 1;
    union1.var3 = 0;
    union1.var4 = 1;
    union1.var5 = 1;
    union1.var6 = 1;
    union1.var7 = 0;
    union1.var8 = 0;

    //union1.octet contient 01011100
    1. erreur:

      c'est struct1.var1
      struct1.var2 ...
      1. union1.struct1.var1 ...
    2. Modérateur
      Pas con le shift de bit (<<)... Mais il me semble qu'avec juste des masques ( &, |, ... on peut s'en sortir...)