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)

这称为按位与。

按位与的插图

   //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

请参阅有关按位与的这些教程:

于 2011-05-15T13:40:15.460 回答
2

按位运算(在这种情况下为 AND)在 2 个操作数之间执行逐位运算。例如 & :

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

c里面有一个位。128 是10000000二进制的。if(k.c[2] & c)检查是否也设置了该位k.c[2]。然后 c 中的位被移动以检查其他位。

结果,程序被制作为显示浮点数的二进制表示。

于 2011-05-15T13:41:58.227 回答
1

代码中的按位运算

c = 128因此二进制表示是

c = 10000000

a & cwill and every i th but if cwith evert i th bit of a. 因为c只有1在 MSB 位置(pos 7),所以a & c如果在其位置 7 位有 a,则非零,如果a在pos 位有 a ,则为零。上面的块中使用了这个逻辑。根据字节的 MSB(位置 7 位)是否为 1 来输入块。1a0a & cifif

假设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中向左移动一个位置,因此1inc向左传播。因此,在使用其他变量进行的每次迭代中,您都能够知道变量的该位置是否存在 a1或 a 0

在您的代码中使用

你有

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

在 union 内部float和 thechar c[4]共享相同的内存位置(作为 union 的属性)。现在,sizeof (f) = 4bytes)你分配k.f = 5345341或任何东西。当您访问数组k.arr[0]时,它将访问 float 的第 0 个字节f,当您访问时,k.arr[1]它将访问 float 的第一个字节f。数组不是空的,因为浮点数和数组都指向相同的内存位置,但访问方式不同。这实际上是一种按字节访问浮点数的 4 个字节的机制。注意k.arr[0]可能会寻址最后一个字节而不是第一个字节(如上所述),这取决于内存中存储的字节顺序(请参阅 little endian 和 big endian 字节顺序)

               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 位传播到第c0位,并且逐位与检查实际上检查 float 变量字节的每个位位置,并打印一个如果是 1 则为 1,否则为 0。1cf

如果打印浮点数的所有 4 个字节,则可以看到 IEEE 754 表示。

于 2011-05-15T13:50:15.083 回答