2011-06-15 13 views
9

¿Cómo invierto los dígitos de un número usando bitwise?Dígitos decimales inversos en javascript

de entrada:

x = 123; 

de salida:

x = 321; 

¿Cómo hacer esto?

+4

¿Quiere decir que invierte los bits o revertir una cadena? Invertir los bits significa cambiar 1 a 0 y viceversa (en un valor binario). –

+1

Quiere decir "invertir los dígitos decimales", no "invertir los bits" ... –

+0

¿Qué quiere decir con "bits", ya que obviamente no se refiere a bits? –

Respuesta

11

Si quería hacer una inversión sencilla:

var x = 123; 
var y = x.toString(); 
var z = y.split("").reverse().join(""); 
var aa = Number(z); 
document.write(aa); 

http://jsfiddle.net/jasongennaro/gV39e/

+2

¿Entonces 1000 y 1 se invierten al mismo número? – kennebec

+0

Buen punto, @kennebc. Debería haberlo dejado en 'var z', como' cadena', pero estaba convirtiendo nuevamente a #. No anticipé el 1000. @alex tiene una solución a la anterior. –

+0

Esto podría fallar. Por ejemplo, ¿qué sucede si la entrada conduce a un desbordamiento si la inviertes? – Christian

14

Eso no es invertir bits; eso invierte el orden de los dígitos decimales, que es completamente diferente. He aquí una forma (la más eficiente, creo):

var x = 123; 
var y = 0; 
for(; x; x = Math.floor(x/10)) { 
    y *= 10; 
    y += x % 10; 
} 
x = y; 

Si realmente desea invertir los bits, que es:

x = ~x; 

En función:

function reverse(n) { 
    for(var r = 0; n; n = Math.floor(n/10)) { 
     r *= 10; 
     r += n % 10; 
    } 
    return r; 
} 
+0

generalmente cuando surge esta pregunta (casi siempre en una entrevista) esperan que responda de esta manera sin convertir el número a una cadena –

+0

Esto no funciona para los decimales. –

+0

@QuentinEngles: la mayoría de las personas necesita hacer esto con números enteros. Algo con una parte fraccionaria probablemente esté mejor hecho (y tal vez incluso mejor representado) como una cadena. – Ryan

4

aquí es otra camino ...

var reversed = num.toString().split('').reverse().join(''); 

jsFiddle.

Si lo quería de nuevo como Number, use parseInt(reversed, 10). Tenga en cuenta, sin embargo, que 0 s no son significativos en un número decimal, y los perderá si los convierte a Number.

0

Éstos son funciones de matriz reversibles en JavaScript que manejan números enteros o cadenas:

function reverse(array) 
{ 
    var left = null; 
    var right = null; 
    var length = array.length; 
    for (left = 0, right = length - 1; left < right; left += 1, right -= 1) 
    { 
     var temporary = array[left]; 
     array[left] = array[right]; 
     array[right] = temporary; 
    } 
    return array; 
} 

function toDigitsArrayFromInteger(integer, isReverse) 
{ 
    var digits = []; 

    if (integer > 0) 
    { 
     var floor = window.Math.floor; 
     while (integer > 0) 
     { 
      digits.push(floor(integer % 10)); 
      integer = floor(integer/10); 
     } 

     // Array is populated in reverse order. Un-reverse it to make it normal. 
     if (!isReverse) 
     { 
      digits = reverse(digits); 
     } 
    } 
    else if (integer < 0) 
    { 
     digits = toDigitsArrayFromInteger(-integer, isReverse); 
    } 
    else if (integer === 0) 
    { 
     digits.push(0); 
    } 

    return digits; 
} 

function toDigitsArrayFromString(string, isReverse) 
{ 
    var digits = []; 

    string += ""; // Coerce to string. 

    var i = null; 
    var length = string.length; 
    for (i = 0; i < length; i += 1) 
    { 
     var integer = parseInt(string.charAt(i), 10); 
     if (isFinite(integer)) 
     { 
      digits.push(integer); 
     } 
    } 

    if (isReverse) 
    { 
     digits = reverse(digits); 
    } 

    return digits; 
} 

Una vez que tenga los dígitos como una matriz, puede invertir la matriz fácilmente para obtener los dígitos comenzando desde la izquierda o desde la derecha.

La función de cadena es más versátil porque puede encontrar cualquier dígito en una cadena, mientras que la función entera está limitada a enteros.

Puntos de referencia: http://jsperf.com/todigitsarray

Los puntos de referencia entre las dos funciones muestran que en Firefox 10 y Chrome 12, la función de cadena es de 30% a 60% más rápido que la función de número entero. En Opera 12, la función entera es ligeramente más rápida en aproximadamente un 10%.

-1

El bloque de código a continuación debe hacer el truco

<script type = "text/javascript"> 

var input; 

input=window.prompt ("Please enter a number to be reversed."); 
x=input.length; 

while(x > 0) 
{ 

x=x-1; 
document.write(input[x]); 

} 

</script> 
0
<html> 
<script> 

function reverseInt(n){ 

     var r=0; 
    while(n!=0){ 
     r*=10; 
     r+=n%10; 
     n=Math.floor(n/10); 
} 
return r; 
} 


</script> 
</html> 
+1

¿Podría agregar alguna explicación? – Undo

2

también utilizar esta función

function myfunction(a){ 
    var x=a.toString(); 
    var y= x.split(""); 
    var z=y.reverse(); 
    var result=z.join(""); 
    return result; 

} mifuncion (123);

0

probar esto

var n = 352; 
function loop(n, r){ 
    if(!n) return r; 
    r = (r ? r * 10 : 0) + n % 10; 
    return loop(Math.floor(n/10), r); 
} 
console.log(loop(n)); 
2

solución simple y rápida: Supongamos que desea invertir un número 4546. Tendrá que tomar el recordatorio de cada división por 10 y lo añadirá al resultado hasta que el número es> 0. y a la vez la actualización de la variable num dividiéndolo por 10.

var x = ''; 
var num = 4546; 
while(num>0){ 
x = x + (num%10); 
num = parseInt(num/10); 
} 
console.log(x); 
0

OK, cómo sobre el uso y el encadenamiento de estos trucos populares en JavaScript en función de una línea de la siguiente manera ...

const reverseNum = num => +("" + ~~num.split("").reverse().join("")); 

y llamarlo como estos:

reverseNum(123); //321 
reverseNum(423.09); //324 
reverseNum(23305.1); //50332 
reverseNum(89112); //21198 
reverseNum(568434.2389); //434865 
Cuestiones relacionadas