【问题标题】:Java - get the quotient and remainder in the same step?Java - 在同一步骤中获得商和余数?
【发布时间】:2018-09-21 16:12:14
【问题描述】:

似乎为了在 Java 中找到除法的商和余数,必须这样做:

int a = ...
int b = ...

int quotient = a / b;
int remainder = a % b;

有没有办法这样写,以便在一个步骤中找到商和余数(一次除法运算)?或者 Java 是否已经自动优化了这段代码?

【问题讨论】:

  • 你会如何在纸上进行一次操作?
  • 不能在一行中给两个不同的变量赋值。
  • @Shark 在纸面上,长除法同时为您提供商和余数。有人告诉我,除法算法往往只提供其中一种。
  • @Shark 你可以在任何一步停止长除法。你知道5 进入11 两次。 2*5=1011-10=1=remainder.
  • 在 Java 中没有办法做到这一点。当它得到 JIT 时,它可能会将其简化为单个 idiv 指令。您也可以使用 JNI,但最终可能会明显变慢。

标签: java integer-division


【解决方案1】:

由于两者是不同的操作,因此无法一步完成。一个是除法,另一个是余数。因此,您需要两个变量来存储这两个操作的结果。

【讨论】:

  • 但是计算机在进行除法时会找到余数,对吗?我想避免为了得到余数而进行二次除法。
  • @FuzzyCat444 “计算机在进行除法时会找到余数,对吗?” - 不,它找到商。余数是单独的指令。
  • @Strikegently 那完全回答了我的问题
  • @Strikegently 我在 Reinderien here 的一篇帖子中发现“通常,处理器上的模数和除法运算是同一回事。例如,请参阅 jsimlo.sk/docs/cpu/index.php/div.html。这是实现英特尔处理器上的除法指令。”
  • 但是Java不能运行汇编,因为不同的处理器有不同的指令集。您也许可以在 C 中的内联 __asm 块中执行此操作,但不是 Java,而不会使事情变得过于复杂...通过编写必要的 C 代码,将其编译为共享库,加载库并调用必要的 JNI 指令来返回一个Pair<Integer, Integer>,其中包括商和余数。
【解决方案2】:

所有体系结构的自然行为是除法指令在单独的寄存器(二进制)或存储区(IBM zSeries 上的压缩十进制)中提供商和余数。我所知道的唯一具有相同功能的高级语言是 COBOL。必须再次重复除法指令以获得余数似乎总是很浪费。

【讨论】:

    【解决方案3】:

    如果你需要这样做,

    int a = ...
    int b = ...
    
    int quotient = a / b;
    int remainder = b - (a * b);
    

    使用的 CPU 稍微少一些,但除非您多次这样做,否则其中的 CPU 并不多。做 10 亿次第一次用时 5.3 秒,第二次用时 3.8 秒。在我的测试中也有一个 FOR 循环。

    【讨论】:

      【解决方案4】:
      public int []result (int a , int b){
      int quotient = a / b;
      int remainder = a % b;
      int [] array=new int[2];
      array[0]=quotient;
      array[1]=remainder;
      return array;
      }
      
      public void main(){
      
      int a=..;
      int b=...;
      
      int [] results=result(a,b);
      }
      

      【讨论】:

      • 如果你假装这是“一步”,那么它就是完美的解决方案!
      • 这与 OP 想要避免的相同。两个操作,而不是一个。
      猜你喜欢
      • 2012-01-09
      • 2011-08-01
      • 2013-11-14
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多