0
#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

4 に答える 4

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 に関する次のチュートリアルを参照してください。

于 2011-05-15T13:40:15.460 に答える
2

ビット演算 (この場合は AND) は、2 つのオペランド間でビットごとの演算を実行します。たとえば & :

11010010 &
11000110 =
11000010
于 2011-05-15T13:44:13.103 に答える
1

cには 1 つのビットが設定されています。128 は100000002 進数です。if(k.c[2] & c)そのビットも設定されているかどうかを確認k.c[2]します。次に、c のビットをシフトして、他のビットをチェックします。

その結果、プログラムは float のバイナリ表現を表示するように作られているようです。

于 2011-05-15T13:41:58.227 に答える
1

コード内のビット演算

c = 128したがって、バイナリ表現は

c = 10000000

a & cwill と i番目cごとに、しかし evertの場合は の i番目のビットa。は MSB 位置 (位置 7) にcのみあるため、その位置 7 ビットにがある場合は非ゼロになり、位置ビットに がある場合はゼロになります。このロジックは、上記のブロックで使用されています。ブロックは、バイトのMSB (位置 7 ビット) が 1 であるかどうかに応じて入力されます。1a & ca1a0a & cifif

aが次のいずれかでa = ? ? ? ? ? ? ? ?あるとします 。?01

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 位置左にシフトされるため、は左方向1c伝播します。したがって、他の変数を使用した各反復マスキングで、変数のその位置に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 = 5345341k.arr[0]fk.arr[1]fk.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。1cf

float の 4 バイトすべてを出力すると、IEEE 754 表現が表示されます。

于 2011-05-15T13:50:15.083 に答える