6

我在一些 AS 3.0 代码中遇到了这个问题:

(duration >> 0)

其中持续时间是一个Number. 我想我知道按位右移是做什么的,但是移动 0 位有什么意义呢?这在代码中发生了几次,我想了解它的作用。

4

4 回答 4

8

数字到整数的转换在 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

于 2009-08-12T12:04:28.110 回答
8

这有几个原因。。

首先,在某些情况下,当我们使用左移、右移时,乘法和除法实际上更快......

即二进制中的数字 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 的方向舍入。

于 2010-12-06T19:46:36.717 回答
4

在没有调用 Math.floor() 开销的情况下摆脱小数可能是一个技巧,因为即使使用数字作为输入,您也会得到一个整数。

我不确定这如何将性能与执行(更常见的)强制转换为 int(x) 进行比较

于 2009-06-25T11:38:17.220 回答
3

有时你会在枚举中看到这个只是为了完整性,即

flag0 = 1 >> 0,
flag1 = 1 >> 1,
flag2 = 1 >> 2

等等。如果您在代码中遇到这种情况,我希望这只是实际需要转移的部分(测试、更改的需求)的剩余部分。也就是说,当然,除非此运算符不是 AS3 中的移位运算符。例如,在 C++ 中,它也用作输入流运算符(您知道,因为您将一些输入转换为一些变量。叹息)。

于 2009-06-25T10:16:56.853 回答