#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;
}
4 に答える
if(k.c[2] & c)
これは、ビットごとの AND と呼ばれます。
ビットごとの AND の図
//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)
ビットごとの AND は、次の真理値表を使用します。
X | Y | R = X & Y
---------
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1
ビットごとの AND に関する次のチュートリアルを参照してください。
ビット演算 (この場合は AND) は、2 つのオペランド間でビットごとの演算を実行します。たとえば & :
11010010 &
11000110 =
11000010
c
には 1 つのビットが設定されています。128 は10000000
2 進数です。if(k.c[2] & c)
そのビットも設定されているかどうかを確認k.c[2]
します。次に、c のビットをシフトして、他のビットをチェックします。
その結果、プログラムは float のバイナリ表現を表示するように作られているようです。
コード内のビット演算
c = 128
したがって、バイナリ表現は
c = 10000000
a & c
will と i番目c
ごとに、しかし evertの場合は の i番目のビットa
。は MSB 位置 (位置 7) にc
のみあるため、その位置 7 ビットにがある場合は非ゼロになり、位置ビットに がある場合はゼロになります。このロジックは、上記のブロックで使用されています。ブロックは、バイトのMSB (位置 7 ビット) が 1 であるかどうかに応じて入力されます。1
a & c
a
1
a
0
a & c
if
if
aが次のいずれかでa = ? ? ? ? ? ? ? ?
あるとします
。?
0
1
a = ? ? ? ? ? ? ? ?
AND & & & & & & & &
c = 1 0 0 0 0 0 0 0
---------------
? 0 0 0 0 0 0 0
として0 & ? = 0
。したがって、ビット位置 7 が 0 の場合、答えは 0 です。ビット位置 7 が 1 の場合、答えは 1 です。
各反復c
で は 1 位置左にシフトされるため、は左方向1
にc
伝播します。したがって、他の変数を使用した各反復マスキングで、変数のその位置にa1
または aがあるかどうかを知ることができます。0
コードで使用する
あなたが持っている
union temp
{
float f;
char c[4];
} k;
ユニオン内では、float
とは同じメモリ位置を (ユニオンのプロパティとして)char c[4]
共有します。今、あなたは何かを割り当てます。配列にアクセスすると float の 0 番目のバイトにアクセスし、そうすると floatの 1 番目のバイトにアクセスします。float と配列の両方が同じメモリ位置を指していますが、アクセス方法が異なるため、配列は空ではありません。これは実際には float の 4 バイトにバイト単位でアクセスするためのメカニズムです。これは、メモリ内のストレージのバイト順序に依存します (これについては、リトル エンディアンとビッグ エンディアンのバイト順序を参照してください) 。sizeof (f) = 4bytes)
k.f = 5345341
k.arr[0]
f
k.arr[1]
f
k.arr[0]
Union k
+--------+--------+--------+--------+ --+
| arr[0] | arr[1] | arr[2] | arr[3] | |
+--------+--------+--------+--------+ |---> Shares same location (in little endian)
| float f | |
+-----------------------------------+ --+
または、バイト順が逆になる可能性があります
Union k
+--------+--------+--------+--------+ --+
| arr[3] | arr[2] | arr[1] | arr[0] | |
+--------+--------+--------+--------+ |---> Shares same location (in big endian)
| float f | |
+-----------------------------------+ --+
コードはこれをループし、ビット 7 からビット 0 にc
のみ伝搬するを各位置で一度に 1 ステップずつシフトし、ビットごとの AND 処理により float 変数のバイトのすべてのビット位置を実際にチェックし、a を出力します。 1 の場合は 1、それ以外の場合は 0。1
c
f
float の 4 バイトすべてを出力すると、IEEE 754 表現が表示されます。