C# “与”的区别是什么;1<&书信电报;x";及;pow(2,x)“;?
所以,在使用Unity时,我必须使用位运算符。现在,请不要误会我的意思,我完全了解位运算符的用处,在某些情况下,如果不生成一堆难看的代码,它是无法替换的。问题更像是。。。a和b的区别是什么,这里:C# “与”的区别是什么;1<&书信电报;x";及;pow(2,x)“;?,c#,unity3d,math,comparison,bit-manipulation,C#,Unity3d,Math,Comparison,Bit Manipulation,所以,在使用Unity时,我必须使用位运算符。现在,请不要误会我的意思,我完全了解位运算符的用处,在某些情况下,如果不生成一堆难看的代码,它是无法替换的。问题更像是。。。a和b的区别是什么,这里: double a = 1 << 3; double b = Math.Pow(2, 3); double a=1一般来说,对于大多数语言: pow函数的效率可能较低,因为它基本上是通用的,可以将任意数提升到任意幂次,因此无法在特殊情况下轻松优化 位移位将直接映射到处理器级操作 在某些语言
double a = 1 << 3;
double b = Math.Pow(2, 3);
double a=1一般来说,对于大多数语言:
pow函数的效率可能较低,因为它基本上是通用的,可以将任意数提升到任意幂次,因此无法在特殊情况下轻松优化
位移位将直接映射到处理器级操作
在某些语言中,编译器会看到操作有一个恒定的结果,并使用该结果,但是如果复杂度稍高,则可能会错过优化
是什么阻止任何人在逐位运算符上使用Math.pow?
它真的会改变什么吗
有几件事:
(int)Math.Pow(2,y)代码>的可读性不如1精细。。。假设我不是个傻瓜,忘记了那个细节。。。为清晰起见。<代码> 1原则上考虑<代码> In .Max值,并且考虑该示例,没有什么可以阻止智能编译器为两者生成相同的代码。然而,实际的编译器所做的可能没有那么聪明。一个更有趣的例子可能是查看函数double-pow2(int n){return Math.Pow(2,n);}
以查看生成了什么代码。当使用大于2**53的较大数字时,使用BigInt和使用bitshift(因为Math.Pow不支持BigInt)更好/更安全。我理解这种差异,是的。但是我想看看如果我需要让我的代码对那些不太高级的人更清晰,并且可能对学习感兴趣的人来说,我是否可以使用Math.Pow()版本。如果你需要说清楚的话,就用评论。你的第一点完全是主观的。
// y >= 0
int result = unchecked((int) (Math.Pow(2, y % 32) + 0.5));