检查java中长操作的进位

2023-12-30

我正在对 long 类型的数字进行加/减。有没有办法确定此操作是否会设置理论进位?


这应该做:

/**
 * Add two long's with overflow detection (r = s + d)
 */
public static long add(final long s, final long d){
    final long r = s + d;
    if (((s & d & ~r) | (~s & ~d & r)) < 0)
        throw new RuntimeException("long overflow add(" + s + ", " + d + ")");
    return r;
}

之前已经在这里问过这个问题:Java 如何处理整数下溢和溢出以及如何检查它? https://stackoverflow.com/questions/3001836(那里也描述了减法)

编辑:由于不清楚 OP 是否意味着无符号加法,因此也不太难检测。如果我们重新思考这个问题,“如果我们有两个(无符号)64 位值并将它们相加,结果中是否会设置第 64 位(假设原始操作数中的位编号从 0=LSB 到 63=MSB)”

稍加逻辑思考即可得出这样的结论:如果以下多个条件为真,则将设置第 64 位:

  • 操作数 1 的位 63 被设置
  • 操作数 2 的位 63 被设置
  • 两个操作数的低位 (0-62) 之和产生到位 63 的进位

这很容易检查:

long operand1 = ...
long operand2 = ...
long bitMask = Long.MAX_VALUE; // bits 0-62 set, bit 63 clear
int conditions = 0;
if (operand1 < 0)
    ++conditions; 
if (operand2 < 0)
    ++conditions;
if (((operand1 & bitMask) + (operand2 & bitMask)) < 0)
    ++conditions;
if (conditions > 1)
    System.out.println("carry would be set!");

我没有花任何时间思考如何优化,我确信有一个更简洁的解决方案。

对于无符号减法,它非常简单:如果 b 大于 a,则在 (a - b) 中发生借位。这可以通过无符号比较来检查,可以用 java 表示为:

long flipSignBit = Long.MIN_VALUE; // only bit 63 set, others clear
if ((a ^ flipSignBit) < (b ^ flipSignBit))
    System.out.println("borrow occurs");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查java中长操作的进位 的相关文章

  • 使用 JDBC 获取 Oracle 11g 的最后插入 ID

    我是使用 Oracle 的新手 所以我将放弃之前已经回答过的内容这个问题 https stackoverflow com questions 3131064 get id of last inserted record in oracle
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 为什么ARM说“链接寄存器支持快速叶函数调用”

    我最近遇到了链接寄存器和叶函数的概念 我从之前的 SO 读中了解到 LR 告诉代码之前在执行期间的位置 我还知道叶函数是位于函数调用层次结构末尾的函数 The ARM 维基百科页面说 https en wikipedia org wiki
  • 更改 TextView 颜色

    如何更改单个 TextView 的 R G B TextView 没有亮度属性 它们的前景色和背景色使用 ARGB 值设置 例如 0xff000000 表示不透明的黑色背景 0xffffffff 表示不透明的白色前景 要增加亮度 只需将 R
  • 使用超过 30m 前更新的时间戳进行拉取的查询无法正常工作

    我绞尽脑汁试图解决这个问题 一切似乎都很顺利 但它并没有按照我的预期工作 我有一个索引test index并附有以下文件 index test index type testType id AV33b VYUyX1XZAq7NTI scor
  • 使用 CSS 和 jQuery 的动态、表格式列表项行

    我有一个内容项列表 每个内容项都有设定的宽度但不同 可变 的高度 列表中的每个项目都会向左浮动 HTML 和 CSS 如下 ul li h3 Item One h3 img src one png p First item content
  • 开发人员应该提交 Go 生成的代码吗?

    我使用代码生成器插件根据 OpenAPI 规范生成服务器存根 我想知道是否应该将生成的代码提交给版本控制 一般来说 是的 推理很简单 如果我是您代码的下游用户 也就是说 我只想将您的库作为依赖项包含在内或构建您的应用程序 那么构建您的代码就
  • 使用 vb.net 将表脚本编写为 CREATE TO

    在 SQL Server 中 我可以创建一个与另一个表重复的表 并在其中设置所有约束 我可以在 SQL Server Management Studio 中使用脚本表作为 CREATE TO 来执行此操作 然后我可以在另一个数据库中运行该脚
  • Smalltalk ReferenceStream 对新实例变量有问题吗?

    在 Pharo Smalltalk 中 我使用 ReferenceStream 序列化对象列表 这是我要序列化的对象的类定义 Object subclass Task instanceVariableNames title notes li
  • 整合银行账户[已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何 API 可以将银行帐户集成到 NET 应用程序中 我希望为用户提供将银行对账单提取到我的软件
  • 动态铸造?

    我需要一种方法将对象转换为编译时未知的类型 像这样的东西 object obj public type of obj Obj get return obj set obj type of obj value 唯一知道的是 obj 是一个值类
  • 远程 Glassfish v4.1 部署上出现 TimeoutException

    我在 OVH 上有 VPS 假设它是 vpsXXXX ovh net 使用 Debian 7 我已经安装了 Java 8 Glassfish 4 1 并启用了安全管理 asadmin gt change admin password use
  • 使用Sql Server 2016的OPENJSON函数从Json文档中的多个数组元素中选择结果

    是否可以在 Sql Server 2016 中将来自多个数组元素的 json 文档的部分组合成单个结果 给定这个 json fruit types possible Apples Bananas Pears category Basic p
  • C# 控制电脑音量

    有没有办法在 C 中控制计算机的实际音量并将其显示在垂直轨迹栏中 我几乎已经尝试了一切 但一定有一些东西我错过了 Thanks 您是否尝试过使用winmm dll通过 p Invoke 库 这就是本文所推荐的 http www dreami
  • 测试 SQLite 触发器内的 COUNT()>X

    如何比较 SQLite 中触发器内的 COUNT 结果 到目前为止 这是我想出的代码 CREATE TRIGGER mytrigger BEFORE INSERT ON mytable BEGIN SELECT CASE WHEN SELE
  • Django 查询聚合同一字段中匹配实例的总和

    我有以下 Django 2 1 模型 class Sales models Model product name models ForeignKey Product category models ForeignKey Category s
  • 如何在kubernetes环境中使用spark配置beam python sdk

    TLDR 如何使用 environment type EXTERNAL 或 PROCESS 配置 Apache Beam 管道选项 描述 目前 我们在 Kubernetes 中有一个独立的 Spark 集群 如下this https sta
  • MySQL存储过程中的变量

    我遇到了这个简单存储过程的问题 我想保存LAST INSERT ID放在一个变量中 然后将其分配给下一个插入 DELIMITER CREATE PROCEDURE Adda Name varCHAR 45 Surrname varCHAR
  • 非空参数的方法引用?

    我正在读关于Java 8 特性 http www techempower com blog 2013 03 26 everything about java 8 而且我看到他们有方法引用 但是我没有看到当方法重载时如何指定哪个方法 有人知道
  • Google 图表图例 - 重叠文本

    我在页面中使用谷歌图表 但图例文本重叠 如下图所示 这是我的代码 var dataTable new google visualization DataTable dataTable addColumn date Data dataTabl
  • Symfony2:与非命名空间 SDK(特别是 PayPal)集成

    我创建了一个PaypalBundle并添加了贝宝商家 php sdk https github com paypal merchant sdk php to my composer json现在我有一个vendor paypal merch
  • 检查java中长操作的进位

    我正在对 long 类型的数字进行加 减 有没有办法确定此操作是否会设置理论进位 这应该做 Add two long s with overflow detection r s d public static long add final