在c语言程序开发中,一些移位操作似乎可以获得与乘除操作相同的效果。 例如,41是2。 在这种情况下,向右移动一位相当于除以2。 同样,21为4,此时向左移动一位相当于乘以2。
因此,也有教材推荐换挡操作来代替乘除操作,据说能有效地提高最终的c语言程序,真的是这样吗?
真的是这样吗?
得到
移位代替乘除,C语言程序效率更高吗?
答案最简单直接的方法是做实验。 下面是两个关于哈希算法的c语言程序。 请看:unsignedinthash(charconst*s ) )。
{
无符号h=0;
wile () s!=' ' ) {
h=127 * h (不一致通道) s;
s;
}
返回h;
}
读者可选择h=127 * h (统一通道) s; 一行,此时c语言代码使用乘法操作。 接下来是另一个c语言代码。 请看。
unsignedinthash(charconst*s ) )。
{
无符号h=0;
wile () s!=' ' ) {
h=(h7 )-h )无符号char ) s;
s;
}
返回h;
}
唯一的区别是使用h7移位操作而不是127 * h乘法操作
与前面的c语言代码相比,唯一的区别是使用h7移位操作而不是127 * h乘法操作。 我的机器测试了这两种c语言代码的效率。 结果,两者几乎都很快,在某些情况下,127 * h版本的c语言代码可能更快
在
解析
C语言程序中,使用移位操作而不是乘除操作更快吗? 这个问题已经有答案了。 不是那样的。 其原因是,c语言编译器一般都知道如何优化我们的代码,尽快提高目标处理器体系结构的能力,即如何尽快生成程序。因此,作为c语言程序员,应该向编译器明确传达意图(即,是i * 2还是i1 ),并根据上下文决定如何生成更高速的指令。
向编译器明确传达我们的意图
如果硬件不支持快速乘除,编译器会将乘除转换为移位和加法/减法的适当组合。 因为它知道我们的最终目的,所以与其写偶尔显示的移位代码,不如直接告诉编译器我们的目的,这样才能尽快得到C语言程序。
实际上,简单的移位操作与乘除运算不同,还有以下简单移位无法实现的乘法运算。
-5/2=-2
-5 1=-3
I*3=(I1 ) I
I*10=(I3 ) (i1 ) ) ) ) ) ) ) ) ) ) ) ) ) )。
因此,使用移位操作而不是乘除操作可能会带来意想不到的结果。 另外,班次的组合会使同事难以理解该c语言代码的真正意图,也不利于联合开发和后维护。
第
小结
节讨论了c语言程序开发中移位操作和乘除操作的关系,并讨论了它们之间的效率问题。 可见,没有必要在意两者的取舍。 事实上,考虑到代码的可读性和编译器的优化特性,我们应该编写“本意”代码:在想要实现乘除操作时编写乘除代码。 如果想实现换档操作,写换档代码。
点了赞再走吧
欢迎在评论区讨论、质疑。 文章都是手工原创,每天最浅显地介绍c语言、linux等嵌入式开发。 如果你喜欢我的文章,关注一波吧。 可以看到最新的更新和以前的文章哦。
未经许可禁止转载。