代码之家  ›  专栏  ›  技术社区  ›  Sietse

as3位移位0?

  •  6
  • Sietse  · 技术社区  · 15 年前

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

    (duration >> 0)
    

    其中持续时间是 Number . 我想我知道 bitwise right shift 是的,但是移动0位的意义是什么?这在代码中发生过几次,我想了解它的作用。

    4 回复  |  直到 14 年前
        1
  •  8
  •   hfs    14 年前

    这有几个原因。

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

    即二进制数字1为00000001 左移到00000010,现在是2……即1×2

    将它移动两次,乘以/除以4,3次8,4次16,等等…

    它没有被过度频繁地使用,但是在像C/C++的物理引擎端口的情况下,处理大量的数据,或者一些3D引擎,我们会看到移位作为原始代码的一个补充,或者仅仅是为了速度。

    (例如,在一些J2ME移动Java游戏中也可以看到它,其中浮点单元是不可用的,即将一个值左移10位,剩下的10位就像一个小数点。然后在绘制到屏幕位置时将其移回实际值,以牺牲整体可能大小为代价)

    上面提到的另一个用途是用于快速数学.floor();—但是有一个关键的不同之处。 几个月前,我用box2d做了一些基准测试,发现它快了数百倍——奇怪的是,我假设这两个转换都是本地处理的。

    当舍入负数时,
    数学楼层(-7.6)=-8 和 (-7.6<<0)=-7

    即,数字(浮点数)上的<<0将沿0的方向四舍五入。

        2
  •  8
  •   roxanna    15 年前

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

        3
  •  4
  •   grapefrukt    15 年前

    这可能是一个不用调用math.floor()的开销就可以去掉小数的技巧,因为即使使用数字作为输入,也会得到一个整数。

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

        4
  •  3
  •   OregonGhost    15 年前

    有时,为了完整性,您会在枚举中看到这一点,也就是说。

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

    等等。如果您在代码中遇到这种情况,我希望它只是实际需要进行更多转换(测试、更改需求)时的一些遗留问题。当然,也就是说,除非这个操作符不是AS3中的移位操作符。例如,在C++中,它也被用作输入流运算符(你知道,因为你正在把一些输入转换成一些变量)。叹气)。