当前位置: 首页 > 面试题库 >

Java长乘法的高位?

段干弘扬
2023-03-14
问题内容

long在Java中,有什么方法可以得到2 的乘法的高半部分吗?即由于溢出而消失的部分。(因此128位结果的高64位)

我习惯于在命令执行以下mul_hi操作的地方编写OpenCL代码:http
:
//www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/mul_hi.html

由于OpenCL可以在我的CPU上有效地html" target="_blank">执行此操作,因此Java应该也可以执行此操作,但是我找不到如何在Java中执行该操作(甚至有效地模仿其行为)。用Java可能吗?如果可以,怎么办?


问题答案:

尽管误差是有限的,但大多数情况下可接受的解决方案是错误的(66%)(它可能比精确结果小2,并且永远不会大)。这来自

  • 忽略x_lo * y_lo产品
  • 首先转移,然后添加x_hi * y_lox_lo * y_hi

我的解决方案似乎始终适用于非负操作数。

final long x_hi = x >>> 32;
final long y_hi = y >>> 32;
final long x_lo = x & 0xFFFFFFFFL;
final long y_lo = y & 0xFFFFFFFFL;
long result = x_lo * y_lo;
result >>>= 32;

result += x_hi * y_lo + x_lo * y_hi;
result >>>= 32;
result += x_hi * y_hi;

在十亿个随机操作数上进行了测试。对于极端情况应进行特殊测试并进行一些分析。

处理负操作数将更加复杂,因为它会禁止使用无符号移位并迫使我们处理中间结果溢出。

万一速度无关紧要(很少有),我会去

 BigInteger.valueOf(x).multiply(BigInteger.valueOf(y))
     .shiftRight(64).longValue();


 类似资料:
  • 问题内容: 输出为: 如果是正确的! 问题答案: 在Java中,所有数学运算都是在处理所有当前值所需的最大数据类型中完成的。因此,如果您具有int * int,它将始终以整数形式进行数学运算,但将int * long作为long进行运算。 在这种情况下,将1024 * 1024 * 1024 * 80作为一个Int完成,它将溢出int。 当然,“ L”会强制其中一个操作数为Int-64(long)

  • 问题内容: 我只是在玩Java。编写了这个小程序: 输出如下: 2147483647 -2 2147483645 -4 2147483643 -6 2147483641 -8 2147483639 -10 现在我很惊讶。我不知道如何解释这个输出。我知道我可以使用long代替大于整数的最大限制来处理值。但是我只想知道java如何计算这个? 问题答案: 我们需要分析结果的二进制内容: Integer.

  • 问题内容: 我有做乘法和加法的方法,但是我只是无法理解它们。它们都是来自外部网站,而不是我自己的: 我尝试进行逐步调试,但是对我来说确实没有多大意义,尽管它可以工作。 我可能正在寻找的是尝试并了解其工作原理(也许是数学基础?)。 编辑:这不是家庭作业,我只是想学习Java中的按位运算。 问题答案: 让我们开始看乘法代码。这个想法实际上很聪明。假设您有以二进制形式编写的n 1和n 2。然后,您可以将

  • 问题内容: java中List的最大长度是多少?我的意思是列表中可以存储多少个最大元素? 问题答案: 或堆将是最低的

  • 2147483647 -2 2147483645 现在我很惊讶。我不知道如何解释这个输出。我知道我可以使用long代替处理超过整数最大限制的值。然而,我只想知道java是如何计算这个的?

  • 考虑处理可能有数百位数的整数的需要。让我们称之为“超长”整数。显然,它们不能使用int或long int等数据类型进行存储。“超长”整数可以作为用户的输入逐位读入,并存储在一个数组中,超长整数的每个数字都占据数组中的一个位置。问题涉及到将两个正的“超长”整数作为用户的逐位输入。每个数字由用户作为字符输入。正“超长”整数的结尾由$符号的输入和存储表示。 这里,您可以假设正超长整数将占用的最大位数是2