Целое число без знака в JavaScript

Я работаю на странице, которая обрабатывает информацию о IP-адресе, но она дросселирует на том, что целые числа подписываются. Я использую побитовые операторы для ускорения его, но 64-й бит (флаг со знаком/неподписанный) портит его.

Там какой-либо путь состоит в том, чтобы вынудить число быть неподписанным в JavaScript? Это, кажется, хорошо работает, пока подсеть не больше, чем 30, или меньше чем 2.

Попробуйте это:

<html>
<body>

<script type='text/javascript'>
document.write( (1 << 30) +"<br/>");
document.write( (1 << 31) +"<br/>");
document.write( (1 << 32) +"<br/>");
</script>

</body>
</html>

Результат:

1073741824 - 2147483648 1

37
задан Martijn 14 April 2015 в 17:49
поделиться

5 ответов

document.write( (1 << 31) +"<br/>");

Оператор << определен как работающий с 32-разрядными целыми числами со знаком (преобразованными из собственного хранилища чисел с плавающей запятой двойной точности). Итак, 1 << 31 должно приводить к отрицательному числу.

Единственный оператор JavaScript, который работает с 32-битными целыми числами без знака, - это >>> . Вы можете использовать это, чтобы преобразовать целое число в числе со знаком, над которым вы работали с другими побитовыми операторами, в целое число без знака в числе:

document.write(( (1<<31)>>>0 )+'<br />');

Между тем:

document.write( (1 << 32) +"<br/>");

не будет работать, потому что все сдвигаются операции используют только 5 младших битов сдвига (в JavaScript и других C-подобных языках тоже). << 32 равно << 0 , т.е. без изменений.

78
ответ дан 27 November 2019 в 04:14
поделиться

Используйте >>> вместо >>, чтобы получить беззнаковый сдвиг вправо вместо сдвига, расширяющего знак. Все остальные побитовые операторы ведут себя одинаково, независимо от того, подписаны целые числа или нет.

Ваш код нарушает "когда подсеть ... меньше 2" касается. Похоже, у вас может быть ошибка, не связанная с подписью целых чисел.

9
ответ дан 27 November 2019 в 04:14
поделиться

Javascript не содержит целых чисел, все числа фактически являются двойными .

В Javascript 1.5 Reference от Mozilla говорится, что можно безопасно использовать только побитовые операции для 32-битных чисел.

6
ответ дан 27 November 2019 в 04:14
поделиться

Какие у вас IP-адреса? IPv4 использует только 32-битные адреса, поэтому с JavaScript будет все в порядке (с использованием double, что дает 52-битную целую часть ). IPv6 использует 128-битные адреса, поэтому вам придется использовать массив. Я предполагаю, что что-то еще не работает.

[EDIT] Создайте небольшую библиотеку, которая использует массив из двух целых чисел в качестве внутреннего типа данных.

0
ответ дан 27 November 2019 в 04:14
поделиться

Дуглас Крокфорд считает, что побитовые операторы - одна из плохих частей javascript:

В Java побитовые операторы работают с целыми числами. В JavaScript нет целых чисел. Он имеет только числа с плавающей запятой двойной точности. Итак, побитовые операторы преобразуют свои числовые операнды в целые числа, занимаются своими делами, а затем преобразуют их обратно. На большинстве языков эти операторы очень близки к оборудованию и работают очень быстро. В JavaScript они очень далеки от оборудования и очень медленные. JavaScript редко используется для обработки битов.

- Дуглас Крокфорд в «JavaScript: Хорошие части», Приложение B, Побитовые операторы (выделено мной)

Вы уверены, что побитовые операторы действительно ускоряют вашу логику?

они очень далеки от оборудования и очень медленные. JavaScript редко используется для обработки битов.

- Дуглас Крокфорд в «JavaScript: Хорошие части», Приложение B, Побитовые операторы (выделено мной)

Вы уверены, что побитовые операторы действительно ускоряют вашу логику?

они очень далеки от оборудования и очень медленные. JavaScript редко используется для обработки битов.

- Дуглас Крокфорд в "JavaScript: Хорошие части", Приложение B, Побитовые операторы (выделено мной)

Вы уверены, что побитовые операторы действительно ускоряют вашу логику?

8
ответ дан 27 November 2019 в 04:14
поделиться
Другие вопросы по тегам:

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