JavaScript中反转十进制数字

13

如何使用位运算符反转一个数字的数字顺序?

输入:

x = 123; 

输出:

x = 321; 

如何做到这一点?


5
您是说反转比特还是反转字符串?反转比特意味着将1变为0,0变为1(在二进制值中)。 - JW.
3
你的意思是“颠倒小数位”,而不是“翻转位”... - Oliver Charlesworth
你说的“bits”是什么意思?显然你不是指比特。 - Christian Rau
为什么一定要使用位运算符?这是作业吗? - alex
使用位运算反转数字?不是这样的。位运算翻转位,而反转数字重新排列位的集合(字节)。它们是不同的操作。 - RobG
14个回答

19

那不是反转位,而是翻转十进制数字的顺序,这是完全不同的。以下是一种方法:

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

如果您真的想要翻转比特(bit),则应该这样做:

x = ~x;

作为一个函数:

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

1
通常当这个问题被提出时(几乎总是在面试中),他们希望你回答这种方式,而不是将数字转换为字符串。 - daedelus_j
@QuentinEngles:大多数情况下,人们需要使用整数来完成这个任务。带有小数部分的内容最好使用字符串来处理(甚至可能更好地表示)。 - Ry-
@minitech 看起来大体正确,但我希望找到一个针对我的大十进制数的数学解决方案。我正在使用非常大的十进制数。这是有充分理由的。 :) - Quentin Engles

14

3
那么1001被颠倒后仍然是同一个数字吗? - kennebec
好观点,@kennebc。我应该把它留在var z,作为一个string,但我又转回了#。没有预料到1000。@alex在上面有一个解决方案。 - Jason Gennaro
这可能会失败。例如,如果输入导致溢出,如果你反转它会发生什么? - Christian
1
@JasonGennaro 如果x是负整数怎么办?如果x是-123,结果应该是-321。但在你的情况下,它将是NaN。 - SPGuar

6

这里还有另一种方法...

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

jsFiddle

如果你想将其转换为Number,请使用parseInt(reversed, 10)。但要注意,前导的0在十进制数中并不重要,如果你转换为Number,它们将会丢失。


3
您也可以使用此函数。
function myfunction(a){
   var x=a.toString();
   var y= x.split("");
   var z=y.reverse();
   var result=z.join("");
     return result;

我的函数(123);


2
反转正/负整数的方法
function reverseInt(n) {
 return parseInt(n.toString().split('').reverse().join()) * Math.sign(n)
}

如果 n 是 -5,那么 Math.sign(n) ==> 将返回 -1

如果 n 是 5,那么 Math.sign(n) ==> 将返回 1


(说明:该段内容是关于 JavaScript 中的 Math.sign() 方法的解释,它用于确定一个数字是正数、负数还是零)

2

简单快捷的解决方案:假设您想翻转一个数字4546。您将从每个除以10的余数中获取并附加到结果,直到数字>0为止。同时通过将其除以10来更新num变量。

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

1

以下是处理整数或字符串的 JavaScript 可逆数组函数:

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;
}

一旦你将数字作为数组获取,你可以轻松地反转数组以从左侧或右侧开始获取数字。

字符串函数更加灵活多变,因为它可以在字符串中查找任何数字,而整数函数仅限于整数。

Benchmarks: http://jsperf.com/todigitsarray

两个函数之间的基准测试表明,在Firefox 10和Chrome 12中,字符串函数比整数函数快30%至60%。在Opera 12中,整数函数略快约10%。

1
//reverse integer
const revInt = (num)=>{
  //turn into string
  if(Math.sign(num)===1)
    return parseInt(num.toString().split('').reverse().join(''));
  else return -1*parseInt(num.toString().split('').reverse().join(''));
}

console.log(revInt(-501));

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
你能加上一些解释吗? - Undo

0

这个函数以参数 Number x 为输入,并返回倒序的数字。

const reverse = (x) => Number(x.toString().split("").reverse().join(""));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接