Quelle est cette partie «if (kc [3] & c)» partie du code?
-
14-11-2019 - |
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;
}
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 1
Alors
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.