维基百科说,按2的权力划分
由于位移通常比除法快得多,因此以这种方式用移位替换除法可能是程序优化中有用的步骤。[5]但是,为了软件的可移植性和可读性,通常最好使用除法运算编写程序并信任编译器来执行此替换。
我可以信任编译器吗?哪些编译器(尤其是C编译器和java编译器)将用>> k替换/ 2 ^ k?
答案 0 :(得分:2)
对于有符号类型除法和右移是从编译器的角度看的不同操作,即使你知道该值是非负的,除非它在编译时已知并且编译器能够使用它。
对于无符号类型,我相信所有体面的现代编译器都会改变划分。例如,对于此代码:
unsigned my_div(unsigned x) {
return x / 32;
}
unsigned my_shift(unsigned x) {
return x >> 5;
}
(当功能采用int
代替unsigned
时,请注意difference)
所以,通常你应该使用普通除法,因为它保证是正确的。只有在以下情况下才应将其替换为右移: