Question sur les décalages de bits...

cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008 - 9 sept. 2004 à 20:15
 racpp - 10 sept. 2004 à 16:07
Bonjour,

Hier, je me faisais un petit programme pour afficher un nombre en binaire.
Je voulais faire ça sur un char, un int, et un double.
Je me suis servi des décalages binaires >> et <<.

Or, tout va bien quand je fais ce décalage sur un char ou sur un int, mais lorsque je veux faire ce décalage binaire sur un double, le compilo me met un message d'erreur, comme-ci il ne pouvait pas calculer ce décalage binaire.
Comment ça se fait?

Vous êtes d'accord avec moi que l'on est censé pouvoir faire un décalage binaire sur un double qui devrait pouvoir aller jusqu'à un décalage de 64 bits dans les deux sens (>>64 et <<64), non?
Ou alors je ne comprends pas tout sur le décalage binaire, ça aurait peut être à voir avec l'architecture de Windows qui utilise seulement 32 bits? Mais alors, je ne comprends toujours pas, car même sur 64 bits, on devrait pouvoir décaler les bits, car les cases mémoires sont censées être à côté, non?

Voilà, je suppose que vous avez compris mon interrogation, alors j'attends vos réponses SVP.

MERCI

JB

62 réponses

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
9 sept. 2004 à 20:23
Les decalages ne peuvent pas s'effectuer sur des float, seulement sur des entiers, c'est logik puis ce que les nombre float par exemple, sont stockés comme ca :

le signe sur 1bit
exposant sur 8bits
et mantisse sur 23bits

donc un decalage ne correspondrait a rien.
Idem pour les float.

++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
9 sept. 2004 à 20:24
Idem pour les double dsl.
Je viens de lire que les operateurs << et >> sont réservés aux types entiers, ta pas un warning ou mm une erreur a la compilation ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
9 sept. 2004 à 20:42
bah si il a une erreur, comme il l'a dit
Si tu veux aboslument faire un décalage avec des flottants, ca doit être possible, mais tu obtiendra des résultats aberrants...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
9 sept. 2004 à 20:46
For example:

int main()
{
float f = 3.14159f; // 32 bits
int* p = (int*)&f;
*p ^= 0x80000000; // change le signe
printf("%f", f);
*p >>= 1;
printf("%f", f);
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
9 sept. 2004 à 20:48
Oui, en fait je voulais justement savoir comment étaient stockés les float, avec la mantisse, l'exposant et le signe comme tu l'expliques AlexMan... Je voulais savoir l'aspect en mémoire de n'importe quel type de données.
Mais donc d'après Vecchio c'est quand même possible. Ca m'interesserait de savoir comment on peut le réaliser. Justement pour connaitre un peu plus comment sont stockés les nombres en mémoire.

JB
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
9 sept. 2004 à 20:51
Et donc, d'après ce que tu me dis Vecchio, on peourrait donc réaliser ce décalage de bits sur 64 bits ou plus!!!!
Si t'avais un exemple pour savoir comment l'utiliser, j'aimerais bien savoir...
Merci.

++

JB
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
9 sept. 2004 à 20:52
int main()
{
float f = 3.14159f; // 32 bits
int* p = (int*)&f, i;
for(i = 0; i < 32; i++)
printf("%d", *p >> i & 1);
}
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
9 sept. 2004 à 21:04
Lol djl, en fait, moi je suis très compliqué avec mes programmes, je fais des trucs sur le moment, même si ce n'est pas très intéressant pour les autres, mais c'est plutot interesant pour moi...

En fait, je voulais pouvoir ouvrir un fichier, et le lire sur un nombre d'octets que je choisi (par exemple, le notepad lit sur 1 octet)...
Donc, je voulais par exemple lire un fichier, et si je coche lire sur 4 octets, alors je voulais lire le fichier sur 4 octets, sur 8 si j'ai envie, etc... (même sur 12 octets).
Mais après, le problème, c'est pour afficher cette lecture, je ne sais pas comment faire, lol, mdr.
Alors j'ai décidé en premier temps d'ecrire ma lecture dans une string de 0 et de 1 successifs...
Par exemple si je lis sur 3 octets le fichier, ma string contiendra 24 successions de 0 et de 1., etc avec les lectures sur 10 octets, etc...
Je ne sais pas si vous avez comris et si ca peut être intéressant, mais c'est juste un but que je me suis fixé!!!

Voila.
J'ai un peu un esprit tordu et bizarre, mais j'essaye pleins de trucs comme ça, et ça me plait, et surtout ça m'amuse.
lol.

JB
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
9 sept. 2004 à 21:04
ben ca a deja ete dit (cf post de AlexMAN)

du coté de math.h ya des trucs aussi

http://www.cplusplus.com/ref/cmath/frexp.html

http://www.cplusplus.com/ref/cmath/ldexp.html

DeAtHCrAsH > ca decale seulement si i est impair
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
9 sept. 2004 à 21:06
jb60 > lit octet par octet (plutot dans un buffer de preference) et affiche la representation binaire avec itoa (pour pas t'embeter)
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
9 sept. 2004 à 21:07
Comme ca on est sur kil a recu le msg, LOL..
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
9 sept. 2004 à 21:10
Pour lire sur plusieurs octets d'un coup et avoir leur représentation binaire, lis un tableau de unsigned char que tu décomposeras à l'aide d'un pointeur.

eRoZion
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
9 sept. 2004 à 21:45
itoa affiche une représentation binaire????
Je croyais que ça transformait simplement un int en une chaine de caractères ASCII...
pour moi:

int i=1254;
char chaine[4];
itoa(je ne me rappele plus exactement les arguments);

change le int i en chaine de char "1254" (chaine terminée par le '\0')
Non?

JB
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
9 sept. 2004 à 21:49
le dernier parametre de itoa est la base, 10 pour decimal, 2 pour binaire...
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
9 sept. 2004 à 22:12
ok djl, je ne savais meme pas, c'est bien plus facile comme ca!

JB
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
9 sept. 2004 à 23:22
djl> quote:"ca ne déplace que si i est impair."
int i = 4;

i = i >> 2 &1;

printf("%d\n",i);


Ca déplace quand meme alors que i vaut 2! Ptite explication plz.

Shell
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
9 sept. 2004 à 23:23
N.B: Quand je parle de 'i', je parle bien évidement du 2 pour reprendre l'exemple de vecchio et non de la variable i.

Shell
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
9 sept. 2004 à 23:25
Oui ca décale tout le temps
Comme je te l'ai dit, ca prend seulement le bit de PF, ou comme quelqu'un d'autre l'a dit, c'est un %2
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
9 sept. 2004 à 23:27
int i = 4;
i = i >> 2 &1;

en binaire:
i = 100b
i >> 2 = 10b
i >> 2 & 1 = 0
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
9 sept. 2004 à 23:34
vecchio56> "i >> 2" ne vaut pas 10b mais 1b.
Et je n'ai toujours pas compris l'histoire de PFaible et PFort et encore moins de modulo :/

Shell
0