大家好,今天小编关注到一个有意思的话题,就是关于c语言位运算移位的问题,于是小编就整理了2个相关介绍c语言位运算移位的解答,让我们一起看看吧。
C语言程序中,使用移位操作代替乘除运算,真的效率更高吗?
你说的对,在计算机中的数字都是二进制数,即是由0和1组成的,在计算机中二进制数的乘除运算有时比加减运算还要快,原理上,二进制数的乘法乘2就是整左移一位,除2就是整个数右移一位,就完成了。用的时间就是一个指令周期,如果你在程序中使用十进制表达式,在程序执行时要先将十进制数变成二进制数,然后再进行二进制数的乘除运算,时间上要多得多。所以,在用C语音编程时,如果直接用二进制数移位算法来执行乘除,速度上要快很多。这是C语音编程的一个优点。
我们目前使用的x86cpu,都属于复杂指令集的cpu,这种cpu的移位指令的指令执行周期为一个时钟周期,而乘法指令是多个时钟周期(具体多少忘了),也就是说执行一个乘法指令可以执行多个移位指令,所以移位指令比乘法指令快,但移位指令只能执行乘或除2的整数次方的运算,而且还有高位或低位被移出(跟移位方向有关),所以只能有限的用,否则会弄巧成拙。
对于c语言为什么移位比乘除快来谈谈我的看法,以前接触过低端单片机,低端单片机底层硬件对移位和乘除的处理是这样的,单片机对移位的操作是单片机内部有一个移位寄存器,而移位就是数据在寄存器里左移或者右移,数据的左移就是除以2,数据的右移就是乘以2,也就对应寄存器的左移和右移操作,所以移位和乘除有某种联系,即移位是乘除的一种方式。并且移位用到了一个寄存器,不需要经过ALU(算术逻辑单元)的运算。对于不是移位的乘除来说不仅要用到多个寄存器,而且还要经过算术逻辑单元的运算,加载寄存器需要时间,算术逻辑单元的运算也需要时间,很明显,用到一个寄存器的移位运算比用到多个寄存器和算术逻辑单元的乘除运算所需时间更少,即移位运算比不是移位的乘除运算快。
先简单小结一下:
当编译器优化能力很弱时,用移位代替简单除法(除2,4,8,16...)效率更高;