Java - 在同一步骤中获得商和余数?
Posted
技术标签:
【中文标题】Java - 在同一步骤中获得商和余数?【英文标题】:Java - get the quotient and remainder in the same step? 【发布时间】: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=10
。 11-10=1=remainder
.
在 Java 中没有办法做到这一点。当它得到 JIT 时,它可能会将其简化为单个 idiv
指令。您也可以使用 JNI,但最终可能会明显变慢。
【参考方案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 想要避免的相同。两个操作,而不是一个。以上是关于Java - 在同一步骤中获得商和余数?的主要内容,如果未能解决你的问题,请参考以下文章