#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 & c
will and every i th but if c
with evert i th bit of a
. 因为c
只有1
在 MSB 位置(pos 7),所以a & c
如果在其位置 7 位有 a,则非零,如果a
在pos 位有 a ,则为零。上面的块中使用了这个逻辑。根据字节的 MSB(位置 7 位)是否为 1 来输入块。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
inc
向左传播。因此,在使用其他变量进行的每次迭代中,您都能够知道变量的该位置是否存在 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 位传播到第c
0位,并且逐位与检查实际上检查 float 变量字节的每个位位置,并打印一个如果是 1 则为 1,否则为 0。1
c
f
如果打印浮点数的所有 4 个字节,则可以看到 IEEE 754 表示。