Просто играл с необычными побитовыми операциями в JavaScript, и в некоторых случаях я получал некоторые странные результаты:
Обычные случаи
1 << 0 // returns 1, makes sense
100 << 0 // returns 100, makes sense
100 >> 0 // returns 100, definitely makes sense
Но при сдвиге на 0 бит все дают нуль
9E99 << 0 // returns 0 ..... Why all bits are cleared?
9E99 >> 0 // returns 0 also ..... All bits cleared?
Infinity >> 0 // returns 0
Infinity << 0 // returns 0
-Infinity << 0 // returns 0 .... Can't explain why
-0 << 0 // also yields 0 not -0 itself
-0 >> 0 // also resolved to 0
Что делать, если бесконечность и побитовый сдвиг
1 << Infinity // returns 1 .. no changes
1024 << Infinity // returns 1024 .. no changes
1024 >> Infinity // returns 1024 .. no changes either
Infinity >> Infinity // 0
Infinity << Infinity // 0
Те вышеперечисленные случаи не имеют для меня большого смысла. При смещении целого числа на нулевые биты значение не изменяется. Но когда вы сдвигаете Infinity
на 0 бит, он фактически возвращает вас 0. Почему?
Я думал, что перенос любого числового значения на 0 бит не должен изменять его значение, не так ли?
Кроме того, когда сдвиг маленького целочисленного значения на бесконечные биты, значение не изменяется вообще. Но когда вы меняете Infinity на любые значения, вместо этого вместо этого заменяется на 0.
Мне действительно интересно, почему эти явления происходят? Существуют ли какие-либо спецификации или теория, объясняющие эти странные поведения?