由于位操作的对象是整型变量,所以你必须利用某种转换让编译器把浮点变量暂时当成整型变量。不过,直接强制转换是不行的:
float f = 12.34;
int i = (int)f; // i最后等于12而不是你想要的结果!
所以,转换必须是“间接”的:
float f = 12.34;
int *p = (int*)&f; // 用指针就OK!
然后,你已经有int指针,要进行位操作完全没问题:
(*p) < < 3; //试试看 :)
对double的位操作没有什么实际的意义。
如楼上所言,你那样是可以实现float的移位,但没有现成的办法很好的支持double(占八个字节)。
而且我想不通楼主为什么要对它进行位操作?
无论是&,~,|,> > , < <,^都没有什么实际的意义。
因为浮点数(包括float,double)的数据一定的位数表示阶码,
一部分表地尾数,首位表示符号位,其表示的值本身是通过
运算得出的,而非像整数一样,可以从十六进制看出点什么,
如果浮点数发生位操作,后果不堪设想。
试想,如果 double i = 1;
i < < 1;(如果支持的话),你算让它等于多少?
(二进制表示为:0000000000000000000000000000000000000000000000001111000000111111)
浮点数 2(二进制表示为)
0000000000000000000000000000000000000000000000000000000001000000
还是1.3718659e+303(这个数的二进制是) (0000000000000000000000000000000000000000000000011110000001111110)
看了这个例子,你还想位操作吗?
关于double占8个字节的问题,解决方案一:
使用union:
union X{
double d;
int arr[2];
};
但应用很受限制,因为实际上double被分成两截。
方案二:
使用C99标准提供的标准int数据类型:int64_t或uint64_t:
double d = 12.34;
int64_t *pi64 = (int64_t*)&d;
uint64_t *pu64 = (uint64_t*)&d;
C99保证所有符合标准的平台如果实现了 int64_t、uint64_t,则它们一定是64位的整型。
其它的,你看着办吧。