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
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
-
ModérateurEuh 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 ?-
-
@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 ! -
@julieSalut julie
Je viens aux nouvelles pour savoir si tu t'en sors avec ton format binaire en langage C.
-
-
-
-
Contributeur@julieBonjour,
Tu as essayé avec 0b ?? -
@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
-
-
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 -
erreur:
c'est struct1.var1
struct1.var2 ... -
ModérateurPas con le shift de bit (<<)... Mais il me semble qu'avec juste des masques ( &, |, ... on peut s'en sortir...)