Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 算术优化_C++_Math_Optimization_Arithmetic Expressions_Integer Arithmetic - Fatal编程技术网

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的补码可用,我们可以使用
    std::intN\u t
    类型,因为这些类型必须是2的补码,不能以其他方式定义。请注意,对于位移位操作(
    ),只要您的类型是有符号的,那么您就不必担心整数是二补格式的负数。例如,
    B@Welbog哦,该死的,我不知道,谢谢。这就是为什么有两组x86移位指令的原因吗?(
    shl
    vs
    sal
    和右)看起来是这样的:@spug,你的意思是说三个整数都是
    inta=0
    ,而不是
    inta=B
    ?任何整数除以一的余数都是零。@miket25哦,是的,谢谢你