Необычное использование побитового XOR в Javascript?

Привет.


Отлаживая недавно очередной кусок чужого кода наткнулся на такой цикл:

while (--i ^ -1) /* тело цикла */;


при этом, изначально i равно некоторому положительному числу. То есть, побитовый оператор используется здесь для целых чисел. Немного подумав, я понял, что результат побитового XOR обратится в нуль единственно в случае, когда числа равны. Тогда условие кастуется в true. В противном случае, будет не-ноль, что кастуется в false.


Получается, можно использовать побитовый XOR вместо оператора != (если мы заранее знаем, что сравниваемые величины суть числа).


Отсюда у меня возник вопрос, который я хочу поставить перед аудиторией.


Почему автор использует XOR?


Вчера весь вечер я размышлял над этим и наиболее правдоподобной причиной мне показалось желание написать «крутой непонятный код». Сразу вспомнилось, как я, когда начинал постигать азы программирования, вдруг обнаружил, что могу писать «лаконичный код, который сложен для понимания и который работает». Мне казалось, что это свидетельствует о каких-то скиллах. На самом деле, понятно, что это свидетельствует об обратном. В пользу этой гипотезы было ещё то, что весь остальной код в окрестности приведённого фрагмента был написан подобным образом.


Правда, мне не давала покоя ещё одна мысль. Я представил себе, что если бы я хотел усложнить код, мне бы почему-то не пришло в голову использовать XOR, даже если бы я и знал о такой возможности.


В результате (безуспешно пытаясь заснуть на протяжение двух часов :) ), я встал, подошёл к компу и написал скриптик, который делал много сравнений тем и иным способом и мерял время.


Оказалось, что если использовать побитовый XOR вместо !=, появляется прирост в производительности (по крайней мере на Firefox), этот прирост стабильный (то есть он есть всегда, то больше, то меньше), но составляет всего лишь около 1%.


Может быть, есть ещё какие-нибудь особенности, дающие преимущество побитовому XOR?
  • Вопрос задан
  • 4441 просмотр
Пригласить эксперта
Ответы на вопрос 7
@MagaSoft
>Вчера весь вечер я размышлял над этим… безуспешно пытаясь заснуть на протяжение двух часов…
Думаю автор добился своего.
Ответ написан
garex
@garex
Только производительность, ибо на понятном процессору языке это все происходит.

А в данном случае скорее это приступ фаллометрии.
Ответ написан
murr
@murr
>> этот прирост стабильный (то есть он есть всегда, то больше, то меньше)
>> составляет всего лишь около 1%

1% прироста это не прирост, а просто маленький выброс в рамках погрешности метода измерения.

Возможно автор хотел написать
while (i --> -1)

но решил, что это слишком просто.
Ответ написан
shergin
@shergin
Может быть, таким способом код ужимает js-минимайзер, например, Google Closure?
Ответ написан
Gorthauer87
@Gorthauer87
Программист
Как вариант код писал фанат оллимпиадного программирования. Там главное задачу решить, уложившись в нормативы, а уж насколько будет непонятным решение неважно.
Ответ написан
Комментировать
Parsing
@Parsing
Может это как-то связано с 64-битным int
Ответ написан
Комментировать
sedictor
@sedictor
1% на скольки итерациях?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы