PDA

Просмотр полной версии : Побитовые операции.


ZackMercury
09.01.2014, 22:25
Читал статейки по оптимизации, и наткнулся на то, что загрузил во вложении.
И тут меня вдруг передернуло. Вспомнилась глава об операторах в книге Мука.
Побитовые операторы >> <<, и просто битовые, или и и(вроде там так было). Загуглил, но споткнулся о то, что с битами выходит туговато. Может мне объяснит суть того, что на скриншоте? Я в корне не понимаю этих операций.
И заодно хотел бы узнать больше о побитовых операциях, где они используются и чем занимаются?

Akopalipsis
09.01.2014, 22:32
По скорости разницы нет, а значит, если и использовать, то не для расчётов.
Вот тут есть пример http://flashpress.ru/blog/bit-mask/

alexcon314
09.01.2014, 23:05
http://www.flasher.ru/forum/blog.php?b=227
http://www.flasher.ru/forum/blog.php?b=235

expl
09.01.2014, 23:12
По скорости разницы нет, а значит, если и использовать, то не для расчётов.
Теоретически сдвиг работает быстрее, т.к. требует меньше тактов процессора, чем честное деление
Практически, кстати, тоже на флеше может дать прирост, хотя может и не дать, потому что:
- не будет заметен на фоне тормознутости других операций
- выражение / 2 может быть преобразовано компилятором в сдвиг (хотя mxmlc туповат, сомневаюсь)
- байткод, соответствующий / 2 может быть преобразован рантайм-компилятором в сдвиг
- часто скорость зависит больше от времени доступа к данным (попадут ли в кеш процессора), чем от количества тактов на собственно обработку

Где используются, если не для производительности:
- получение значения цвета по составляющим RGB
- самописная сериализация/десериализация данных (наверняка в коде ProtoBuf для as3 эти операторы найдете) - просто ими запихивают несколько значений в один байт (BiteArray биты то не принимает) или заталкивают 32-битное число в 16 бит, если оно небольшое :) (например в AMF 3).
- в алгоритмах чтения/записи других бинарных форматов (png, например) тоже наверняка найдёте

dimarik
09.01.2014, 23:21
Сдвиг работает быстрее (http://lab.polygonal.de/?p=81) (статья 2007 года, тесты на текущем компиляторе и рантайме сделайте сами)

alexcon314
09.01.2014, 23:34
Оптимизация за счет битовых операций в математических вычислениях - это не то, ради чего они действительно нужны.
Вот при работе с данными можно поиметь профит: объем по-ужать, обработать по-шустрее, это да.

ZackMercury
09.01.2014, 23:47
Вот при работе с данными
Например, какими такими данными?
Любая переменная хранит в себе данные. Будь то строка, целое число или буль.

Добавлено через 1 минуту
Вот тут есть пример http://flashpress.ru/blog/bit-mask/
Спасибо, вкусная ссылочка. Уже прочитал первые абзацы, почитаю перед сном.

Akopalipsis
09.01.2014, 23:49
А почему и на скрине ТС и в статьях, используется int? Number не кто не использует?

ZackMercury
09.01.2014, 23:59
А почему и на скрине ТС и в статьях, используется int? Number не кто не использует?

Что? Number в цикле? :о
Зачем он там нужен?
Кроме того, вот тут (http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/) даже ругают за это, в целях всеобщей оптимизации.

alexcon314
10.01.2014, 00:01
Например, какими такими данными?
С бинарными, очевидно.

ZackMercury
10.01.2014, 00:02
С бинарными, очевидно.

Вы имеете в виду обмен булями между сервером и пользователем?

Akopalipsis
10.01.2014, 00:06
Что? Number в цикле? :о
В цикле это как? Так -
for(var i:Number=0...
for(var i:int=0...
Если Вы о типе длины, то я согласен, что Number не нужен. Или Вы утверждаете, что свойствам с типом Number вообще не место в циклах?

alexcon314
10.01.2014, 00:09
Уже было сказано, как пример, что я имею в виду:
Где используются, если не для производительности:
- получение значения цвета по составляющим RGB
- самописная сериализация/десериализация данных (наверняка в коде ProtoBuf для as3 эти операторы найдете) - просто ими запихивают несколько значений в один байт (BiteArray биты то не принимает) или заталкивают 32-битное число в 16 бит, если оно небольшое (например в AMF 3).
- в алгоритмах чтения/записи других бинарных форматов (png, например) тоже наверняка найдёте

dimarik
10.01.2014, 00:12
А почему и на скрине ТС и в статьях, используется int? Number не кто не использует?

Битовые операции производятся над целыми числами. Конечно, Number, если присмотреться, занимает 64 бита и выглядит как целое число, если смотреть на ячейки памяти. Токма напрямую его значение нам не передают, а начинают интерпретировать согласно стандарту IEEE 754 (http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8)
Кстати, int забирает бит на знак числа. Лучше (чаще, чем вы думаете) пользовать uint. Хотя, в bitwise operators есть беззнаковый ">>>".

И это... "Никто" instead "не кто".

Akopalipsis
10.01.2014, 00:14
dimarik Спасибо!

ZackMercury
10.01.2014, 00:20
Я не говорю, что вообще не место, но например, при переборе элементов массива:
for(var i:Number=0...
Такое выполняется медленнее, чем такое:
for(var i:int=0...
Читайте первый абзац по ссылке, которую я дал.

Akopalipsis
10.01.2014, 01:57
Читайте первый абзац по ссылке, которую я дал.
Так я то про другое спрашивал. Не про тип длины или элемента, а про тип свойств над которыми проводят операции. Но ответ я уже получил.

Добавлено через 1 час 31 минуту
У меня ещё маленький вопрос о цифрах - вот если в конструкторе, есть не обязательные параметры, типа
(a:Number=NaN,b:Number=NaN,c:Number=NaN);
и нужно пропустить некоторые, то лучше передавать 0, чем NaN. А если ли разница в написании 0 и NaN в самих параметрах?

ZackMercury
10.01.2014, 01:59
и нужно пропустить некоторые, то лучше передавать 0, чем NaN. А если ли разница в написании 0 и NaN в самих параметрах?
NaN и 0 - это разные значения.

Akopalipsis
10.01.2014, 02:17
NaN и 0 - это разные значения.
Это понятно, но 0 присваивается быстрее. Но влияет ли NaN в параметрах, мне это вот интересно.