首页 > 编程知识 正文

C语言除法(c语言中的除法运算)

时间:2023-05-04 17:30:29 阅读:78791 作者:1123

在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等嵌入式开发。 如果你喜欢我的文章,关注一波吧。 可以看到最新的更新和以前的文章哦。

未经许可禁止转载。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。