Какое максимальное целое число безопасно использовать в значении флага битовой маски Javascript?

В основном это просто проверка работоспособности.

Мозилла говорит, что

Операнды всех побитовых операторов преобразуются в 32-разрядные целые числа со знаком в формате дополнения до двух.

и это

Числа -2147483648 и 2147483647 являются минимальными и максимальными целыми числами, представленными через 32-битное число со знаком.

Поскольку 2147483647 равен 0x7FFFFFFF, я считаю, что 0x40000000 (то есть не 0x80000000) - это максимальное число, которое я могу безопасно использовать в качестве значения флага javascript. Но я хотел бы убедиться, что я не пропустил что-то или что нет других ошибок. Заранее спасибо!

1 ответ

Решение

Диапазон значений является полным 32-разрядным значением, т.е. От 0 до 0xffffffff (или 2 32 -1). Будет ли оно подписано или нет, зависит. Если он будет подписан изначально, то это даст -1:

document.write(0xffffffff>>0);

Но вы также можете использовать беззнаковые значения, что означает диапазон [0, 4294967295]:

document.write(0xffffffff>>>0);

Число 0x40000000 даст вам только половину диапазона (в отрицательном диапазоне, в положительном - 0x40000000-1 или 0x3fffffff), так что это не безопасный номер для 32-разрядного диапазона со знаком.

Безопасный диапазон для числа со знаком будет [0x80000000, 0x7fffffff], поэтому общая маска безопасного поля будет 0x7fffffff, однако вам необходимо сохранить бит знака:

number = number < 0 ? number & 0xffffffff : 0x7fffffff;

А для неподписанных ваша маска всегда будет 0xffffffff.

Другие вопросы по тегам