使用位移运算符反转数字

3
我正在尝试找到一种不需要以下步骤的方法反转数字:将其转换为字符串以获取长度反转字符串并解析回来运行单独的循环来计算长度。目前,我的实现方式如下:
 public static int getReverse(int num){
        int revnum =0;
        for( int i = Integer.toString(num).length() - 1 ; num>0 ; i-- ){
            revnum += num % 10 * Math.pow( 10 , i );
            num /= 10;
        }
        return revnum;        
    }

但我希望实现上述的3个条件。

我正在寻找一种方式,可能使用位移操作符或其他类型的位运算。

是否有可能?如果是,怎么做?

注:如果输入为1234,则应返回4321。 我将只颠倒整数和长整数。


3
如何将 10000 进行翻转?只剩下 1 了吗?你会失去那些“零”。 - dacwe
2
使用位运算符反转十进制表示方式的好方法很难找到。 - Oliver Charlesworth
这里根本没有使用位移操作。 - Andreas
3个回答

7
如何呢:
int revnum = 0;
while (num != 0) {
  revnum = revnum * 10 + (num % 10);
  num /= 10;
}
return revnum;

这段代码需要一个非负的输入。

这对您可能重要,也可能不重要,但值得注意的是,getReverse(getReverse(x))不一定等于x,因为它不会保留末尾的零。


1
没关系,如果它不能翻转负数,我只需将其转换为正数并翻转,然后再转换回负数。 - Gautam
我猜 getReverse(getReverse(x)) 现在不会有太大问题,但如果有的话,我可能需要重新考虑我使用这个函数的目的。我认为即使是以前的实现也会遇到同样的问题。 - Gautam
@gautham5678:没错,这是函数签名(int->int)的一个特性,而不是这个实现的特性。 - NPE

2
这个怎么样?它也可以处理负数。
public int getReverse(int num){
   int rst=0;
   int sign;
   sign=num>0?1:-1;

   num*=sign;
   while(num>0){
      int lastNum = num%10;
      rst=rst*10+lastNum
      num=num/10;
   }
   return rst*sign;
}

0

Integer.MAX_VALUEInteger.MIN_VALUE 在任何解决方案中都不被考虑。

例如:如果输入是-21474836472147483647,则输出将分别为1126087180-1126087180

请尝试以下解决方案,其中处理了两个条件,因此如果数字在任何时候超出边界条件,即INPUT_VALUE > Integer.MAX_VALUEINPUT_VALUE < Integer.MIN_VALUE,它将返回0

class ReversingIntegerNumber {
    
    public int reverse(int originalNum) {
        boolean originalIsNegative = originalNum > 0 ? false : true;
        int reverseNum = 0;
        int modValue;
        originalNum = Math.abs(originalNum);
        while(originalNum != 0) {
            modValue = originalNum % 10;
            if(reverseNum > (Integer.MAX_VALUE - modValue)/10) {
                return 0;
            }
            reverseNum = (reverseNum * 10) + modValue;
            originalNum /= 10;
        }
        return originalIsNegative ? -1 * reverseNum : reverseNum;
    }
}

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