2013-11-07 4 views
2

Итак, я играл со сменой в консоли, и результаты меня сильно задевали.Почему нет >>> 100 произвести 0 в JavaScript?

Вход:

a = -1 
a >>> 100 

Выход:

268435455 

Я смотрел на Mozilla reference page about it, но ничего не упоминает о поведении >>> при переключении на больших количествах. Я предположил, что смещение всех битов вправо с нулевым заполнением приведет к нулю.

Это ошибка в Firefox или что-то в этом роде?

ответ

3

Кажется, вы можете перейти только максимум 31.

С сайта вы связаны в вашем посте (MDN):

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

От фактической спецификации (Page 77)

Пусть shiftCount быть результатом маскировки всех, кроме наименее значимых 5 битов rnum, то есть, вычислить rnum & 0x1F.

Что на самом деле происходит, когда вы перемещаетесь на 100 сдвигает на (100 & 0x1F) или 4.

-1 >>> 100 === -1 >>> 4

Если бы вы разбить его на несколько смен, то он будет работать:

-1 >>> 25 >>> 25 >>> 25 >>> 25 === 0

+0

и средняя реализация, похоже, делает X >>> (Y% 32). Следовательно, в примере -1 >>> (100% 32) => -1 >>> 4 = 268435455 –

+1

Побитовые операторы в JavaScript всегда обрабатывают свой операнд как 32-битное целое число со знаком. – alex

+0

^^^ более точно 32-битное знаковое целое число, и поэтому -1 заканчивается как все. – adeneo

1

Любой bitwise operator на Number в JavaScript преобразует его операнд к 32-битовому биллианскому номеру.

Это означает, что если число больше, чем то, что может быть сохранено на 32 бита, оно будет усечено. Big-endian означает, что число хранится в естественным порядком при чтении слева направо, то есть более важные номера сохраняются первыми, поэтому, если число хранится за один байт, более важным является его первый байт.

Это означает, что двоичное представление -1 «ы будет ...

11111111 11111111 11111111 11111111 

(Это в two's complement-1. Это выполняется путем вычисления значения этого числа в двоичной системе, а затем листать каждый бит, и добавление одного .)

Когда вы смените на 100, вы найдете его only shifts by 4, оставив вас с ...не

00001111 11111111 11111111 11111111 

Как вы можете видеть, старший бит больше не устанавливается, так что это не является отрицательным, и это на самом деле 268435455 (число от вашего вопроса).

+0

Нижняя часть? Что тут происходит? – georg

+0

Я не уверен, но если это потому, что мой ответ неправильный, я бы хотел, чтобы у меня была возможность исправить это. – alex

+0

Спасибо за ответ! Твой тоже правильный, но я должен был дать ответ Дэвиду за то, что он был более полным (и так как ему нужен репорт больше, чем тебе). –

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