number - tipos de datos en javascript ejemplos
Entero sin signo en Javascript (6)
Estoy trabajando en una página que procesa la información de la dirección IP, pero se está ahogando por el hecho de que los enteros están firmados. Estoy usando operadores bit a bit para acelerarlo, pero el bit 64 (indicador firmado / no firmado) lo está estropeando.
¿Hay alguna manera de forzar que un número no esté firmado en Javascript? Parece que funciona bien, hasta que la subred es mayor que 30 o menor que 2.
Prueba esto:
<html>
<body>
<script type=''text/javascript''>
document.write( (1 << 30) +"<br/>");
document.write( (1 << 31) +"<br/>");
document.write( (1 << 32) +"<br/>");
</script>
</body>
</html>
Resultado:
1073741824 -2147483648 1
¿Qué tipo de direcciones IP tienes? IPv4 usa solo direcciones de 32 bits, por lo que JavaScript debería estar bien (usando el doble que le da una parte entera de 52 bits ). IPv6 usa direcciones de 128 bits, por lo que deberá usar una matriz. Supongo que algo más está roto.
[EDITAR] Crea una pequeña biblioteca que usa una matriz de dos entradas como el tipo de datos interno.
Aquí hay dos funciones que convierten direcciones ipv4 a / de enteros sin signo en javascript:
function ip2long(ip) {
var ipl=0;
ip.split(''.'').forEach(function( octet ) {
ipl<<=8;
ipl+=parseInt(octet);
});
return(ipl >>>0);
}
function long2ip (ipl) {
return ( (ipl>>>24) +''.'' +
(ipl>>16 & 255) +''.'' +
(ipl>>8 & 255) +''.'' +
(ipl & 255) );
}
Douglas Crockford cree que los operadores bit a bit es una de las partes malas de javascript:
En Java, los operadores bit a bit trabajan con enteros. JavaScript no tiene enteros. Solo tiene números de punto flotante de doble precisión. Por lo tanto, los operadores bit a bit convierten sus operandos numéricos en enteros, hacen sus negocios y luego los convierten de nuevo. En la mayoría de los idiomas, estos operadores están muy cerca del hardware y son muy rápidos. En JavaScript, están muy lejos del hardware y son muy lentos. JavaScript rara vez se usa para manipular bits.
- Douglas Crockford en "JavaScript: The Good Parts", Apéndice B, operadores bit a bit (énfasis añadido)
¿Estás seguro de que los operadores bit a bit realmente aceleran tu lógica?
Javascript no tiene números enteros, todos los números son en realidad dobles.
La Referencia de Javascript 1.5 de Mozilla sugiere que uno solo puede usar operaciones bit a bit de forma segura para números de 32 bits.
Use >>> en lugar de >> para obtener un desplazamiento a la derecha sin signo en lugar de uno extensible a un signo. Todos los demás operadores bit a bit se comportan de la misma manera, independientemente de si las entradas están firmadas o no.
Su código de ruptura "cuando la subred ... es menor que 2" es preocupante. Parece que puede tener algún error no relacionado con la firma de enteros.
document.write( (1 << 31) +"<br/>");
El operador <<
se define como el trabajo en enteros de 32 bits con signo (convertido desde el almacenamiento numérico nativo del flotador de precisión doble). Entonces 1<<31
debe dar como resultado un número negativo.
El único operador de JavaScript que funciona usando enteros de 32 bits sin signo es >>>
. Puede explotar esto para convertir un entero-número-en-firmado en el que ha estado trabajando con los otros operadores bit a bit a un entero-número sin signo:
document.write(( (1<<31)>>>0 )+''<br />'');
Mientras tanto:
document.write( (1 << 32) +"<br/>");
no funcionará porque todas las operaciones de cambio usan solo los 5 bits más bajos de cambio (en JavaScript y otros lenguajes tipo C también). <<32
es igual a <<0
, es decir. ningún cambio.