#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)
这称为按位与。
按位与的插图
//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)在 2 个操作数之间执行逐位运算。例如 & :
11010010 &
11000110 =
11000010
c里面有一个位。128 是10000000二进制的。if(k.c[2] & c)检查是否也设置了该位k.c[2]。然后 c 中的位被移动以检查其他位。
结果,程序被制作为显示浮点数的二进制表示。
代码中的按位运算
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 表示。