Question

#include<stdio.h>
#include<iostream.h>
main()
{
  unsigned char c,i;
  union temp
  {
    float f;
    char c[4];
  } k;
  cin>>k.f;
  c=128;
  for(i=0;i<8;i++)
  {
    if(k.c[3] & c) cout<<'1';
    else cout<<'0';
    c=c>>1;
  }
  c=128;
  cout<<'\n';
  for(i=0;i<8;i++)
  {
    if(k.c[2] & c) cout<<'1';
    else cout<<'0';
    c=c>>1;
  }
  return 0;
}
Était-ce utile?

La solution

Fonctionnement du bit dans votre code

c = 128 Par conséquent, la représentation binaire est

c = 10000000

a & c volonté et tous les jee mais si c avec evert ie un peu de a. Car c a seulement 1 En position MSB (POS 7), donc a & c sera non nul si a a un 1 en sa position 7 bits, si a a un 0 Dans le peu de point, alors a & c sera nul. Cette logique est utilisée dans le if bloc au-dessus. La if Le bloc est entré selon que le MSB (position 7 bits) de l'octet est 1 ou non.

Supposer a = ? ? ? ? ? ? ? ? où un ? est soit 0 ou 1Alors

a = ? ? ? ? ? ? ? ? 
AND & & & & & & & &
c = 1 0 0 0 0 0 0 0
    ---------------
    ? 0 0 0 0 0 0 0

Comme 0 & ? = 0. Donc, si la position du bit 7 est 0, la réponse est 0 est la position du bit 7 est 1, la réponse est 1.

Dans chaque itération c est décalé qui a laissé une position, donc le 1 dans le c propage la gauche. Ainsi, dans chaque masquage d'itération avec l'autre variable, vous pouvez savoir s'il y a un 1 ou un 0 à cette position de la variable.

Utiliser dans votre code

Tu as

union temp
{
  float f;
  char c[4];
} k;

À l'intérieur de l'Union le float et le char c[4] Partage le même Emplacement de la mémoire (comme la propriété de l'Union). À présent, sizeof (f) = 4bytes) Vous attribuez k.f = 5345341 ou peu importe . Lorsque vous accédez au tableau k.arr[0] il accédera au 0e octet du flotteur f, quand tu fais k.arr[1] il accéde au 1er octet du flotteur f . Le tableau n'est pas vide à la fois car le flotteur et le tableau pointe le même emplacement de mémoire mais accéder différemment. Il s'agit en fait d'un mécanisme pour accéder aux 4 octets de Float Bytewise. NOTEZ QUE k.arr[0] Peut aborder le dernier octet au lieu du 1er octet (comme indiqué ci-dessus), cela dépend de l'ordre des octets de stockage en mémoire (voir Little Endian et Big Endian octet Commande pour cela)

               Union k
+--------+--------+--------+--------+   --+
| arr[0] | arr[1] | arr[2] | arr[3] |     |
+--------+--------+--------+--------+     |---> Shares same location (in little endian)
|              float f              |     |
+-----------------------------------+   --+

Ou l'ordre des octets pourrait être inversé

               Union k
+--------+--------+--------+--------+   --+
| arr[3] | arr[2] | arr[1] | arr[0] |     |
+--------+--------+--------+--------+     |---> Shares same location (in big endian)
|              float f              |     |
+-----------------------------------+   --+

Vos boucles de code à ce sujet et déplace le c qui propage le seul 1 dans le c Du bit 7 au bit 0 en une étape à la fois de chaque emplacement, et les vérifications et les vérifications bit f, et imprime un 1 s'il est 1 ailleurs 0.

Si vous imprimez les 4 octets du flotteur, vous pouvez voir la représentation IEEE 754.

Autres conseils

if(k.c[2] & c)

C'est ce qu'on appelle le bit et.

Illustration de bitwise et

   //illustration : mathematics of bitwise AND
   a = 10110101 (binary representation)
   b = 10011010 (binary representation)

   c = a & b 
     = 10110101 & 10011010 
     = 10010000 (binary representation)
     = 128 + 16 (decimal)
     = 144 (decimal)

Bitwise et utilise cette table de vérité:

X | Y | R = X & Y
---------
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1

Voir ces tutoriels sur le bit et:

Un fonctionnement bitwise (et dans ce cas) effectuer un fonctionnement un peu à bit entre les 2 opérandes. Par exemple le &:

11010010 &
11000110 =
11000010

c a un seul bit dedans. 128 est 10000000 en binaire. if(k.c[2] & c) vérifie si ce bit est réglé k.c[2] aussi bien. Ensuite, le bit en C est déplacé pour vérifier les autres bits.

En conséquence, le programme est conçu pour afficher la représentation binaire de Float, semble-t-il.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top