Java 反向整数溢出

Java 反向整数溢出,java,integer,int,overflow,reverse,Java,Integer,Int,Overflow,Reverse,如果我知道multi和result,我怎样才能回到num而不必强制它呢 或者提高我的暴力手段的速度 int num = -340721550; int multi = -214882771; int result = num * multi; // = 10 公共静态int多重逆(int多重,int结果){ 简单地说,对于(int i=Integer.MIN_VALUE;i,您的问题是关于求解以下方程: x*b=a,其中a和b是已知的 通常,这非常简单,因为您可以简单地执行以下操作: x=a

如果我知道multi和result,我怎样才能回到num而不必强制它呢

或者提高我的暴力手段的速度

int num = -340721550;
int multi =  -214882771;
int result = num * multi; // = 10
公共静态int多重逆(int多重,int结果){

简单地说,对于(int i=Integer.MIN_VALUE;i,您的问题是关于求解以下方程:

x*b=a,其中a和b是已知的

通常,这非常简单,因为您可以简单地执行以下操作:

x=a/b

但是,由于我们使用的是整数,因此只有当a是b的倍数时,才能给出正确的解决方案。例如,如果b=2,a=4

如果a不是b的倍数,那么我们知道a*x导致了整数溢出

现在,想一想用b除法意味着什么。你实际上在做的是应用b的倒数。毕竟,b/b=1。用b除法,你就是在“撤消b”

所以我们要做的是找到解决方案,找到一个整数,我们要用它乘以b,得到一个溢出,结果是1

我将给出一个小例子来说明它是如何工作的

假设我们有一个范围为0到8的数据类型,那么它将溢出范围为0到8之外的任何值

在本例中,以下是正确的:
3*3==1
(因为9溢出为1)

现在让我们假设我们有
3*5==7
(因为15溢出到7)

你想要的是,通过知道5和7回到3。更正式地说,你想要在模块8中找到x代表
5x=7

在模8中,5的倒数是5,因为5*5=25,溢出为1

因此,您的解决方案是7*5=3(因为35个溢出为3)


但是,要找到一种简单的方法来求带符号java整数的逆并不容易。如果你能找到它,因为并不是每个整数都能保证有一个逆。

简单地说,你的问题是关于求解以下等式:

x*b=a,其中a和b是已知的

通常,这非常简单,因为您可以简单地执行以下操作:

x=a/b

但是,由于我们使用的是整数,因此只有当a是b的倍数时,才能给出正确的解决方案。例如,如果b=2,a=4

如果a不是b的倍数,那么我们知道a*x导致了整数溢出

现在,想一想用b除法意味着什么。你实际上在做的是应用b的倒数。毕竟,b/b=1。用b除法,你就是在“撤消b”

所以我们要做的是找到解决方案,找到一个整数,我们要用它乘以b,得到一个溢出,结果是1

我将给出一个小例子来说明它是如何工作的

假设我们有一个范围为0到8的数据类型,那么它将溢出范围为0到8之外的任何值

在本例中,以下是正确的:
3*3==1
(因为9溢出为1)

现在让我们假设我们有
3*5==7
(因为15溢出到7)

你想要的是,通过知道5和7回到3。更正式地说,你想要在模块8中找到x代表
5x=7

在模块8中,5的逆为5,因为5*5=25,溢出到1

因此,您的解决方案是7*5=3(因为35个溢出为3)


但是,要找到一种简单的方法来求带符号java整数的逆并不容易。如果你能找到它,因为并不是每个整数都能保证有一个逆。

简单地说,你的问题是关于求解以下等式:

x*b=a,其中a和b是已知的

通常,这非常简单,因为您可以简单地执行以下操作:

x=a/b

但是,由于我们使用的是整数,因此只有当a是b的倍数时,才能给出正确的解决方案。例如,如果b=2,a=4

如果a不是b的倍数,那么我们知道a*x导致了整数溢出

现在,想一想用b除法意味着什么。你实际上在做的是应用b的倒数。毕竟,b/b=1。用b除法,你就是在“撤消b”

所以我们要做的是找到解决方案,找到一个整数,我们要用它乘以b,得到一个溢出,结果是1

我将给出一个小例子来说明它是如何工作的

假设我们有一个范围为0到8的数据类型,那么它将溢出范围为0到8之外的任何值

在本例中,以下是正确的:
3*3==1
(因为9溢出为1)

现在让我们假设我们有
3*5==7
(因为15溢出到7)

你想要的是,通过知道5和7回到3。更正式地说,你想要在模块8中找到x代表
5x=7

在模8中,5的倒数是5,因为5*5=25,溢出为1

因此,您的解决方案是7*5=3(因为35个溢出为3)


但是,要找到一种简单的方法来求带符号java整数的逆并不容易。如果你能找到它,因为并不是每个整数都能保证有一个逆。

简单地说,你的问题是关于求解以下等式:

x*b=a,其中a和b是已知的

通常,这非常简单,因为您可以简单地执行以下操作:

x=a/b

但是,由于我们使用的是整数,因此只有当a是b的倍数时,才能给出正确的解决方案。例如,如果b=2,a=4

如果a不是b的倍数,那么我们知道a*x导致了整数溢出

现在,想一想用b除法意味着什么。你实际上在做的是应用b的倒数。毕竟,b/b=1。用b除法,你就是在“撤消b”

所以我们要做的是找到解决方案,找到一个整数,我们要用它乘以b,得到一个溢出,结果是1

我将给出一个小例子来说明它是如何工作的

假设我们有一个范围从0到0的数据类型
public static int multiInverse(int multi, int result){
    for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++){
        if (multi * i == result){
            return i;
        }
    }
    return -1;
}
  private static final BigInteger modulo = BigInteger.ONE.shiftLeft(32);

  public static int unoverflowDivide(int product, int divisor) {
    if (divisor == 0)
        throw new IllegalArgumentException("No solution");
    while((divisor & 1) == 0){
      if ((product & 1) == 1)
          throw new IllegalArgumentException("No solution"); 
      divisor >>= 1;
      product >>= 1;
    }
    BigInteger bigDivisor = BigInteger.valueOf(divisor);
    BigInteger bigProduct = BigInteger.valueOf(product);
    BigInteger bigInverse = bigDivisor.modInverse(modulo);
    BigInteger bigResult = bigInverse.multiply(bigProduct);
    return bigResult.intValue();
  }