AS3 побитовый сдвиг 0? - PullRequest
       5

AS3 побитовый сдвиг 0?

6 голосов
/ 25 июня 2009

Я сталкивался с этим в каком-то коде AS 3.0:

(duration >> 0)

Где длительность равна Number.Я думаю, что знаю, что делает битовое правое смещение , но какой смысл сдвигать 0 бит?Это происходит несколько раз в коде, я хотел бы понять, что он делает.

Ответы [ 4 ]

8 голосов
/ 06 декабря 2010

Есть несколько причин для этого ..

Во-первых, умножение и деление на самом деле быстрее в некоторых обстоятельствах когда мы используем сдвиг влево, сдвиг вправо ...

т.е. число 1 в двоичном виде - 00000001 Сдвиньте его влево, чтобы оно стало 00000010, и теперь оно 2 .. т.е. 1 х 2

Сдвиньте его дважды, чтобы умножить / разделить на 4, 3 раза на 8, 4 раза на 16 и т. Д. *

Он используется не слишком часто, но в таких случаях, как порт физического движка из C / C ++, обработка огромных объемов данных или некоторые из трехмерных движков, мы увидим сдвиги как остаток исходного кода или просто для скорости.

(Вы могли бы видеть это и в некоторых мобильных java-играх J2ME, например, где единицы с плавающей запятой недоступны, то есть сдвиг значения влево на 10 бит, так что оставшиеся 10 битов действуют как своего рода десятичная точка ... затем сдвиньте его вернуться к действительному значению при рисовании на экране, за счет общего возможного размера)

Другое упомянутое использование для быстрого Math.floor (); - но с ключевым отличием. Несколько месяцев назад я провел несколько тестов, работая с Box2D, и обнаружил, что это в сотни раз быстрее - странно, поскольку я предполагаю, что оба преобразования обрабатываются изначально.

При округлении отрицательных чисел,
Math.floor (-7,6) = -8 а также (-7,6 << 0) = -7 </p>

т.е. << 0 на число (float) будет округлять в направлении 0. </p>

8 голосов
/ 12 августа 2009

Преобразование числа в целое число Использование int (x) на 10% быстрее в AS3. Тем не менее, побитовая версия работает лучше в AS2.

x = int (1,232)

// равна: х = 1,232 >> 0;

лучше всего объяснил: http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/das

4 голосов
/ 25 июня 2009

Это может быть уловка, чтобы избавиться от десятичных дробей без накладных расходов при вызове Math.floor (), так как даже с Number в качестве входных данных вы получите целое число обратно.

Я не уверен, как это сопоставляет производительность с выполнением (более часто видимым) приведения к int (x)

3 голосов
/ 25 июня 2009

Иногда вы увидите это в перечислении только для полноты, т.е.

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

и так далее. Если вы столкнетесь с этим в коде, я ожидаю, что это всего лишь некоторый остаток от того момента, когда на самом деле нужно было что-то изменить (тестирование, изменение требований). Это, конечно, если только этот оператор не является оператором сдвига в AS3. В C ++, например, он также используется как оператор входного потока (вы знаете, потому что вы перемещаете некоторый ввод в некоторую переменную. Вздох).

...