我在一些 AS 3.0 代码中遇到了这个问题:
(duration >> 0)
其中持续时间是一个Number
. 我想我知道按位右移是做什么的,但是移动 0 位有什么意义呢?这在代码中发生了几次,我想了解它的作用。
我在一些 AS 3.0 代码中遇到了这个问题:
(duration >> 0)
其中持续时间是一个Number
. 我想我知道按位右移是做什么的,但是移动 0 位有什么意义呢?这在代码中发生了几次,我想了解它的作用。
数字到整数的转换在 AS3 中使用 int(x) 快 10%。仍然按位版本在 AS2 中效果更好。
x = int(1.232)
//等于:x = 1.232 >> 0;
最好的解释: http: //lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/das
这有几个原因。。
首先,在某些情况下,当我们使用左移、右移时,乘法和除法实际上更快......
即二进制中的数字 1 是 00000001 将其左移成为 00000010 现在是 2 .. 即 1 x 2
将其移动两次以乘以/除以 4、3 次为 8、4 次为 16 等...
它的使用并不频繁,但在诸如来自 C/C++ 的物理引擎端口、处理大量数据或某些 3d 引擎的情况下,我们会将转换视为原始代码的残余,或者只是为了速度。
(例如,您也可能在一些 J2ME 移动 java 游戏中看到它,其中浮点单位不可用,即将一个值左移 10 位,因此剩余的 10 位就像一种小数点。然后将其移回绘制到屏幕位置时的实际价值,以整体可能大小为代价)
提到的另一个用途是快速 Math.floor(); - 但有一个关键的区别。几个月前,我使用 Box2D 进行了一些基准测试,发现它快了数百倍 - 奇怪,因为我假设这两种转换都是本地处理的。
舍入负数时,
Math.floor(-7.6) = -8 和 (-7.6 <<0 ) = -7
即数字(浮点数)上的 <<0 将朝 0 的方向舍入。
在没有调用 Math.floor() 开销的情况下摆脱小数可能是一个技巧,因为即使使用数字作为输入,您也会得到一个整数。
我不确定这如何将性能与执行(更常见的)强制转换为 int(x) 进行比较
有时你会在枚举中看到这个只是为了完整性,即
flag0 = 1 >> 0,
flag1 = 1 >> 1,
flag2 = 1 >> 2
等等。如果您在代码中遇到这种情况,我希望这只是实际需要转移的部分(测试、更改的需求)的剩余部分。也就是说,当然,除非此运算符不是 AS3 中的移位运算符。例如,在 C++ 中,它也用作输入流运算符(您知道,因为您将一些输入转换为一些变量。叹息)。