2016-01-14 7 views
4

This sample code from Mozilla's JS reference использует операторы >> и >>> с аргументом RHS, равным 0. Я предполагаю, что это альтернатива Math.floor(), которая имеет преимущество в производительности, поскольку использует встроенный оператор вместо того, чтобы искать функцию. Но какая разница делает >> vs >>> make с нулевым сдвигом?Назначение >> 0 и >>> 0

+2

Они отлично подходят для кода-гольфа :) –

+1

Разница заключается в том, как они обрабатывают отрицательные числа. В polyfill длина массива никогда не может быть меньше '0' (пустой массив), поэтому использование' >>> 'в порядке, но кто-то может передать отрицательное число для' target', поэтому сохранение знака имеет решающее значение, следовательно, использование '>>'. Например, '-3 >> 0' по-прежнему' -3', но '-3 >>> 0' возвращает' 4294967293' из-за того, как нули сдвинуты слева, так что потенциально может создать неожиданный результат для переменной «target». – adeneo

ответ

2

От MDN Article:

>> является Sign-propagating right shift:

сдвигает в двоичном представлении б (< 32) битов вправо, отбрасывая биты, сдвинутые.

>>> является Zero-fill right shift:

сдвигает в двоичном представлении б (< 32) битов вправо, отбрасывая биты, сдвинутые, и смещение в нулей слева.

Таким образом, разница в том, что сдвиг в нулях слева.

От this stackoverflow answer говорить о нулевом сдвиге:

Так делать операцию побитового, без фактического эффекта, как вправо-смещение 0 бит >> 0, это быстрый способ округлить число и убедитесь, что он находится в 32-битном диапазоне int. Кроме того, оператор triple >>> после выполнения своей неподписанной операции преобразует результаты своего вычисления в Number как целое без знака, а не в числовое целое число, которое они делают, поэтому его можно использовать для преобразования негативов в 32- версия с двумя дополнениями как большой номер. Использование >>> 0 гарантирует, что у вас есть целое число от 0 до 0xFFFFFFFF.

+0

Другой будет также смещаться в нулях слева на половину его входов – Paulpro

+1

Это не отвечает на вопрос: какая разница с нулевым сдвигом? –

1

Он преобразует их в числа, которые могут быть выражены как 32-бит без знака INTS. Так что да, это будет сделать это (число TypeOf) как этажном междунар, он будет также сделать его 32-битную беззнаковое, что программирование JS любит :)

Основное различие подписанную против знака.

Смежные вопросы