Gui*_*nce 0 c# math comparison bit-manipulation unity-game-engine
因此,在使用Unity时,我必须使用按位运算符.现在,不要误解我,我完全了解按位运算符的用处,并且在某些情况下,如果不必编写一堆丑陋的代码就无法替换它.问题更像是...... a和b之间有什么区别,这里:
double a = 1 << 3;
double b = Math.Pow(2, 3);
Run Code Online (Sandbox Code Playgroud)
根据我对函数和二进制的理解,在这两种情况下,你最终在第四个位置得到1,这等于8 ......什么阻止任何人使用Math.pow而不是按位运算符?它真的会改变什么吗?
一般而言,对于大多数语言:
pow功能可能效率较低,因为它基本上是通用的,并且可以将任何数量增加到任何功率,因此无法在特殊情况下轻松优化.
位移将直接映射到处理器级操作.
在某些语言中,编译器会看到操作具有恒定的结果并使用它,但是如果存在更多的复杂性,则可能会错过优化.
是什么阻止任何人通过按位运算符使用Math.pow?它真的会改变某些东西吗?
几件事:
(int) Math.Pow(2, y);
是少可读比1 << y
(int) Math.Pow(2, y)
如果说2.0**10.0
是,可能会带来讨厌的错误1023.99999997
;我们必须更加繁琐(int) (Math.Pow(2, y) + 0.5)
1 << y
要进行FPU计算时要快得多(大约一个CPU滴答)Math.Pow(2, y)
1 << 31
是-2147483648
这是逐位逻辑方便。万一(int)Math.Pow(1, y)
你可以OverflowException
扔1 << y == 1 << (y % 32)
,例如1 << 40 == 1 << 8 == 256
这样也很方便。y
为负, 1 << y
则执行相同1 << (y % 32)
的操作,例如,1 << -31 == 1 << 2 == 4
何时Math.Pow(2, y)
返回2**y
小数(9.31322574615479E-10
在示例中)最后,相当于1 << y
IS
// y >= 0
int result = unchecked((int) (Math.Pow(2, y % 32) + 0.5));
Run Code Online (Sandbox Code Playgroud)
希望,公式能说明一切。因此,请不要使用Math.Pow
而不是班次