要理解这个,我们必须了解float数是如何在内存中存储的。目前已知的所有的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。
float数的格式如下:
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
但是因为指数位的数字可以是正,也可以是负数,那么在存储的时候,指数位都要加上一个127(0x7F);
下面看看代码:
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #include <time.h> 4 #include <stdlib.h> 5 int main() 6 { 7 float a = 123456.123; 8 int b; 9 int i,j; 10 clock_t start,finish; 11 12 double duration; 13 start = clock(); 14 15 for(i=0;i<10000;i++) for(j=0;j<10000;j++)b=(int)a; 16 17 finish = clock(); 18 19 duration = double(finish - start)/CLOCKS_PER_SEC; 20 printf("b=%d time:%lfms\n",b,1000*duration); 21 22 23 start = clock(); 24 for(i=0;i<10000;i++) for(j=0;j<10000;j++) 25 { 26 b = (1<<((((*(int *)(void * )(&a))&0x7F800000)>>23)-0x7F))^((*(int *)((void *)(&a))&0x7FFFFF)>>(150-(((*(int *)(void * )(&a))&0x7F800000)>>23))); 27 } 28 finish = clock(); 29 printf("b:%d time:%lfms\n",b,1000*(double(finish-start)/CLOCKS_PER_SEC)); 30 31 }
从上面运行的结果可以看得出来,效率提高了:(410-460)/460 = 0.1086956522
所以啊,位运算的速度真的很高。
欢迎大家使用wi输入法,http://wi.hit.edu.cn/im