Desplazamiento aritmético y desplazamiento lógico y tipo de datos en js

Primero, mire una pregunta de muestra para ayudar a comprender

Portal de temas
Después de dominar la idea del algoritmo, escribir esta pregunta con js encontrará muchas trampas, >> (tiempo de espera) y >>> (correcto)
Lo siguiente presenta principalmente este problema, que parece simple, de hecho, realmente implica muchas cosas. ¡Míralo con atención! Después de leerlo, tendrá una buena comprensión de las operaciones de turno y los tipos de datos js.

Primero explique algunos puntos:
       1. Por defecto, javascript es un entero con signo, tenga en cuenta que es un entero, un total de 32 bits (incluido el bit de signo).
El rango de valores es de -2 ^ 31-2 ^ 31-1, es decir, -2147483648 a 2147483647.
        2. javascript utiliza la representación real para ser almacenada en 64 bits de precisión doble estándar, bit de signo de 1 bit, exponente de 11 bit, bit 52 bit de mantisa.

Pasemos al tema principal:

       Para el caso de prueba 2 -2147483648

       Usamos el método de exponenciación rápida para resolver, y comenzamos a juzgar si es un número negativo, lo convertimos en un número positivo [2 ^ (- 3) = 1 / (2 ^ 3) = (1/2) ^ 3] , que equivale a encontrar el positivo de sus Varias potencias recíprocas, esto no debería sernos difícil de entender. Las siguientes preguntas vienen,
       1. Convierta -2147483648 en un número positivo 2147483648, que excede el rango de representación de enteros con signo predeterminado (el máximo predeterminado es 2147483647).
           Motivo: aunque excede el rango predeterminado, js lo convertirá automáticamente a un valor sin firmar. entero. Ciertamente, no fuera de rango

(js中的最大最小安全值)
       console.log(Number.MAX_SAFE_INTEGER); //9007199254740991 2^53 -1
       console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991   2^53 -1

2. El siguiente paso es el problema de las operaciones por turnos.

        ¡El punto está llegando!

(1) >>, << significa desplazamiento aritmético, el bit de signo debe considerarse cuando se mueve (los siguientes ejemplos son el bit con signo predeterminado, el bit más a la izquierda es el bit de signo)
        1101 (-3) Desplazamiento aritmético a la derecha en 1 bit 1110 (-2); 1101 (-3) Desplazamiento aritmético a la izquierda en 1 bit 11010 (-6)
        010 (2) Desplazamiento aritmético a la derecha en 1 bit 001 (1); 010 (2) Desplazamiento aritmético a la izquierda en 1 bit 0100 (4) ;

(2) >>>, <<< significa desplazamiento lógico, izquierda y derecha generales, los bits faltantes se llenan 0 (los siguientes ejemplos son el bit con signo predeterminado, el bit más a la izquierda es el bit de signo)
       1101 desplazamiento lógico a la derecha 1 bit 0110; 1101 Desplazamiento lógico a la izquierda 1 bit 1010
       010 Desplazamiento lógico a la derecha 1 bit 001; 010 Desplazamiento lógico a la izquierda 1 bit 100;

En el caso de prueba actual, si usa el desplazamiento aritmético, el número convertido en un número positivo es 2147483648 (exceder el signo significa que se convierte a sin signo por defecto) es exactamente 2 ^ 31, (10000 ……, 31 ceros) el El bit más alto ocupa el bit de signo, en el primer ciclo, la operación se realiza de acuerdo con el entero sin signo para ingresar al ciclo. Al realizar la operación de cambio, si elige el cambio aritmético, el número sin signo se considerará como un número con signo para la operación. , y el cambio Después de eso, n se convierte en un número negativo y sale del ciclo, por lo que en este caso el ciclo sólo se realiza una vez. Si se usa el cambio lógico, este problema no ocurrirá Por supuesto, la forma de Math.floor (n / 2) también es equivalente al cambio lógico, lo que resuelve este error.

Supongo que te gusta

Origin blog.csdn.net/qq_44606064/article/details/114698020
Recomendado
Clasificación