C++ 算术优化
如何优化以下操作(将算术转换为逐位操作) 优化:C++ 算术优化,c++,math,optimization,arithmetic-expressions,integer-arithmetic,C++,Math,Optimization,Arithmetic Expressions,Integer Arithmetic,如何优化以下操作(将算术转换为逐位操作) 优化: inta=B*4 inta=B*72 int A=B%1 inta=B%16 inta=(B+C)/2 inta=(B*3)/8 inta=(B%8)*4 在面试中看到了这些问题。面试官可能是在错误的观念下寻找你将算术转换为位运算的能力,这种观念会更快。编译器将执行优化,因此无需进行优化。如果您没有优化编译器,那么正确的做法是分析代码,查看性能瓶颈在哪里,并修复它们。算术不太可能成为您的性能瓶颈 也就是说,这可能就是面试官想要的: B*4,
inta=B*4
inta=B*72
int A=B%1
inta=B%16
inta=(B+C)/2
inta=(B*3)/8
inta=(B%8)*4
在面试中看到了这些问题。面试官可能是在错误的观念下寻找你将算术转换为位运算的能力,这种观念会更快。编译器将执行优化,因此无需进行优化。如果您没有优化编译器,那么正确的做法是分析代码,查看性能瓶颈在哪里,并修复它们。算术不太可能成为您的性能瓶颈 也就是说,这可能就是面试官想要的:
,可以使用位移位操作执行二的幂的乘法,例如B*4
B所有这些计算都可以通过位移位来完成;然而,这只适用于正数。我们需要有一个否定输入的特殊案例,因为面试官没有具体说明是哪一个
- 4=22的乘法可以通过左移2位来实现
inta=(B<0)-(-B)3;
inta=(B<0)?-((-B)和7)你按原样编写它们,让编译器发挥它的魔力。听起来像是一个家庭作业,想让你想起位移位运算符……他们可能想让你谈论移位和按位and,但让编译器找出答案才是正确的。@AliSharabiani好吧,我们可以。但是编译器可以做得更好,更可靠,而且ef更少fort。此外,您可以避免使用无用的、神秘的优化来混淆代码。我还应该指出,第三条语句int A=B%1;,将始终为零。没有奇特的位操作,只有模算术实现。如何将这些转换为位操作?(将更新问题)我认为我们还需要考虑负数,因为面试官没有指定输入为正数。对于不接近整数极限的数字,位移位2的补码整数仍然可以按您预期的方式工作。您可能会争辩说,整数不能保证为2的补码格式,但我认为,除非你知道整数格式,否则不应该首先进行位移位。是的,但位移位有符号整数是个坏主意,而且这种代码只适用于高压嵌入式平台;在其他任何地方,过早的优化都会使代码变得模糊,并使其本质上不可用可移植。不过,我想为了确保2的补码可用,我们可以使用
类型,因为这些类型必须是2的补码,不能以其他方式定义。请注意,对于位移位操作(std::intN\u t
),只要您的类型是有符号的,那么您就不必担心整数是二补格式的负数。例如,B@Welbog哦,该死的,我不知道,谢谢。这就是为什么有两组x86移位指令的原因吗?(
vsshl
和右)看起来是这样的:@spug,你的意思是说三个整数都是sal
,而不是inta=0
?任何整数除以一的余数都是零。@miket25哦,是的,谢谢你inta=B
- 4=22的乘法可以通过左移2位来实现