嵌入式操作系统(比如Nucleus、Vxworks、OSE等)中的移位运算和乘2的N次方是不是一样的?

时间:2021-07-14 20:05:06
最近想通过定点运算实现一个算法,为了尽量提高效率,打算采用移位运算,想问一下,在嵌入式操作系统(比如Nucleus、Vxworks、OSE等)中的移位运算和乘2的N次方是不是一样的操作?这个和操作系统有关还是编译器的问题?是不是有的编译器会进行优化后,编译的结果就相同了?
哪位大侠能给详细的解释一下,谢谢!

15 个解决方案

#1


关注

#2


右移n位相当于除以2的n次方,左移n位相当于乘以2的n次方,谭浩强书里写着。

#3


理论上是一样,不过得到相应芯片上去检验,正数、负数移位后的情况。不过标准C语言是带符号移位,左移最低位补0,右移最高位补原先的最高位。

#4


个人感觉和 编译器有关,另外我想一般的CPU是支持移位运算的;和OS没有多少关系 吧;

#5


应该是这样的吧。

#6


引用 2 楼 linwendong1982 的回复:
右移n位相当于除以2的n次方,左移n位相当于乘以2的n次方,谭浩强书里写着。

这个结果我是知道的,我是想关注一下对于编译器来说,实际运行的方式是不是也是一样的(比如乘512和移位运算都按照移位操作)?
我怀疑有的编译器不会做优化,也就是说可能有的编译器会分别按照乘法和移位运算,有的编译器统一按照移位运算以提高效率。
不知道标准C在这方面是否有规定,编译器具体是如何处理的呢?

#7


跟操作系统无关
与编译器有关,一般来说,编译器优化后的结果是一样的

不过有的CPU带有硬件乘法器,这种情况下编译器编译出来的结果可能不一样,移位的速度肯定比乘法快

#8


引用楼主 jack_wq 的回复:
最近想通过定点运算实现一个算法,为了尽量提高效率,打算采用移位运算,想问一下,在嵌入式操作系统(比如Nucleus、Vxworks、OSE等)中的移位运算和乘2的N次方是不是一样的操作?这个和操作系统有关还是编译器的问题?是不是有的编译器会进行优化后,编译的结果就相同了?
 哪位大侠能给详细的解释一下,谢谢!


理论上移位运算和乘2的N次方是一样的结果,但是否一样的操作则不一定,由编译器决定。如果有把握的话,还是移位好,移位的效果是一样的,乘法编译出来的结果有可能不同,最快也就是移位的效果。

#9


关注

#10


移位的操作,绝对够快,如果可以,尽量用移位而不是用乘方,谁知道编译器有没有优化呢。

#11


和符号有关系吗?

#12


应该是和编译器相关

#13


C/C++的语法规定位运算的规则,而编译器的厂商必须实现这个规则。规则本身与平台没有关系,所以你大可放心。

#14


关于基本运算的优化,这个需要编译提供这样的支持。

#15


一样的

#1


关注

#2


右移n位相当于除以2的n次方,左移n位相当于乘以2的n次方,谭浩强书里写着。

#3


理论上是一样,不过得到相应芯片上去检验,正数、负数移位后的情况。不过标准C语言是带符号移位,左移最低位补0,右移最高位补原先的最高位。

#4


个人感觉和 编译器有关,另外我想一般的CPU是支持移位运算的;和OS没有多少关系 吧;

#5


应该是这样的吧。

#6


引用 2 楼 linwendong1982 的回复:
右移n位相当于除以2的n次方,左移n位相当于乘以2的n次方,谭浩强书里写着。

这个结果我是知道的,我是想关注一下对于编译器来说,实际运行的方式是不是也是一样的(比如乘512和移位运算都按照移位操作)?
我怀疑有的编译器不会做优化,也就是说可能有的编译器会分别按照乘法和移位运算,有的编译器统一按照移位运算以提高效率。
不知道标准C在这方面是否有规定,编译器具体是如何处理的呢?

#7


跟操作系统无关
与编译器有关,一般来说,编译器优化后的结果是一样的

不过有的CPU带有硬件乘法器,这种情况下编译器编译出来的结果可能不一样,移位的速度肯定比乘法快

#8


引用楼主 jack_wq 的回复:
最近想通过定点运算实现一个算法,为了尽量提高效率,打算采用移位运算,想问一下,在嵌入式操作系统(比如Nucleus、Vxworks、OSE等)中的移位运算和乘2的N次方是不是一样的操作?这个和操作系统有关还是编译器的问题?是不是有的编译器会进行优化后,编译的结果就相同了?
 哪位大侠能给详细的解释一下,谢谢!


理论上移位运算和乘2的N次方是一样的结果,但是否一样的操作则不一定,由编译器决定。如果有把握的话,还是移位好,移位的效果是一样的,乘法编译出来的结果有可能不同,最快也就是移位的效果。

#9


关注

#10


移位的操作,绝对够快,如果可以,尽量用移位而不是用乘方,谁知道编译器有没有优化呢。

#11


和符号有关系吗?

#12


应该是和编译器相关

#13


C/C++的语法规定位运算的规则,而编译器的厂商必须实现这个规则。规则本身与平台没有关系,所以你大可放心。

#14


关于基本运算的优化,这个需要编译提供这样的支持。

#15


一样的