读书人

十进制转成16进制 (整除取余法)与(

发布时间: 2012-09-16 17:33:16 作者: rapoo

十进制转成16进制 (整除取余法)与(移位 与数 法) 速度比较

下面的代码是 float 转成16bit的 16进制数, 精度只保留到0.1。

char tranfer[2]={0};
float temp=80.56;
tranfer[0]=((int)(temp*10))/256;//右移8位
tranfer[1]=((int)(temp*10))%256;//取低8位


tranfer[0]=((int)(temp*10))>>8; //右移8位
tranfer[1]=((int)(temp*10))&0xFF;//取低8位


在IAR编译中对比了2个方法的速度,第二种方法比第一钟快1/4左右, 有个疑惑。/256 除数是2的整倍数 为什么还是比>>8 慢了1/4? 而我添加一句tranfer[0]=((int)(temp*10))/9;//右移8位 发现比tranfer[0]=((int)(temp*10))/256;//右移8位 只慢了一点点 1/200 都不到。

tranfer[0]=((int)(temp*10))/256;和tranfer[0]=((int)(temp*10))>>8; 不同的地方在哪里?

tranfer[1]=((int)(temp*10))%256;为甚取余 可以得到低8位?

[解决办法]
楼主还是去补习一下二进制基础 和 汇编知识吧。

第一个问题: 简单的说,除法运算变成机器指令后,要远远大于移位运算。
第二个问题: 2^8 = 256, 一个int变成二进制后,是32位,把低8位归零,剩下24位肯定能被256整除,所以对它用256取模就是取低8位。
[解决办法]
1.只知道移位运算快于除法运算
2.2^8=256

读书人网 >C语言

热点推荐