public int abs( int a ) {
return (a + (a >> 31)) ^ (a >> 31) ;//前半部分-1或+0,后半部分取反

}

a为正数的情况下,向右移31位

a >> 31 = 00000000 00000000 00000000 00000000

a为负数的情况下,向右移31位

a >> 31 = 11111111 11111111 11111111 11111111

所以,a为正数的情况下公式成立显而易见,a为负数的情况就是求a的补码的过程的逆过程

求补码的过程为:

正数原码 --> 求反得到补码 --> 再加1得到补码

举个-1试试

-1的绝对值原码

00000000 00000000 00000000 00000001

---------------------

先求反,这里求反可以通过异或的方式得到,即

00000000 00000000 00000000 00000001

^

11111111 11111111 11111111 11111111

得到反码

11111111 11111111 11111111 11111110

---------------------

再加1得到补码

11111111 11111111 11111111 11111110

+

00000000 00000000 00000000 00000001

得到补码

11111111 11111111 11111111 11111111

所以-1的补码就为

所以-1的补码就为

现在将这个过程逆向即可

现将补码-1得到反码,而-1在计算机里就是+(-1)

11111111 11111111 11111111 11111111

+

11111111 11111111 11111111 11111111 ---> 发现没,这个值等于 a >> 31

得到反码

11111111 11111111 11111111 11111110 ---> 最高位越界直接丢失

--------------------

再将反码转为原码,一样是通过异或操作得到

11111111 11111111 11111111 11111110

^

11111111 11111111 11111111 11111111 ---> 发现没,这个值也等于 a >> 31

得到原码

00000000 00000000 00000000 00000001

所以-1的原码就为00000000 00000000 00000000 00000001,而这个值就是-1的绝对值,为1。

通过上面的推到过程,不难看出整数的绝对值就等于

(a + (a >> 31)) ^ (a >> 31)
————————————————
版权声明:本文为CSDN博主「藏青色的猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_34897112/article/details/114548602

java中取整数绝对值_Java之——位运算求整数绝对值通过下面的位运算可以得到一个整数的绝对值的更多相关文章

  1. Java中取小数点后两位(四种方法)

    摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法)   一 Long是长整型,怎么有小数,是double吧     java.text.D ...

  2. Java中取整和四舍五入

    import java.math.BigDecimal;  import java.text.DecimalFormat; public class TestGetInt{  public stati ...

  3. JAVA中取余(%)规则和介绍

    在java中%的含义为取余. java :a%b 数学公式a%b=a-(a/b)*b

  4. JAVA中取子字符串的几种方式

    有这样一串字符串:String s = "共 100 页, 1 2 3 4..."; 假如我想把"100"给取出来,该如何做? 方法一: 采用split的方式 ...

  5. JAVA中让Swagger产出更加符合我们诉求的描述文档,按需决定显示或者隐藏指定内容

    大家好,又见面啦. 在前一篇文档<JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率>中,我们探讨了如何通过自定义注解的方式扩展swagger的能力让Swag ...

  6. Java中取两位小数

    请参考下面函数: private String getFormated(String s){        float f=Float.parseFloat(s);        java.text. ...

  7. Java中取某一个范围的随机数

    一.取模操作 public static void main(String[] args) { for (int i = 1; i <= 20; i++) { int j = i % 11; S ...

  8. Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)

    import java.util.*; /* * 输入一个整数,计算它各位上数字的和. * (注意:是任意位的整数) */ public class Sum02 { public static voi ...

  9. 浅谈Java中的补零扩展和补符号位扩展

    今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合. ...

  10. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

随机推荐

  1. FCoE测试重启调试记录

    环境 CPU:Phytium,S2500/64 C00 内核版本:4.19.90-25.10 网讯网卡:txgbe 共两台设备,光纤直连 复现步骤 设备A.B分别执行以下操作,即可复现 modprob ...

  2. 有趣的python库-pyttsx3

    pyttsx3-语音播报功能 基本使用: import pyttsx3 px = pyttsx3.init() px.say("hello world") px.runAndWai ...

  3. 关于Visual Studio使用头文件"stdafx.h"报错原因

    当我们需要使用"stdafx.h"该头文件时,Visual Studio会报错,提示我们无法打开源文件"stdafx.h",实际上在Visual Studio中 ...

  4. OpenLayers地图标注及弹窗实现

    1. 引言 地图标注是在地图中进行文字或图标的标注,从而显示对应的信息 本文基于OpenLayers实现地图上图文的标注与弹窗显示 OpenLayers官网:OpenLayers - Welcome ...

  5. I2C接口(续一)

    I2C接口共涉及到18个寄存器,下面就来对它们进行具体分析. 先来看I2C配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40050000(I2C0),0x40054000(I2C1),0x4 ...

  6. Word19 撰写企业质量管理论文office真题

    1.看到题目要求:打开考试文件下的素材文档"WPS.docx"文件,后续操作均基于此文件,否则不得分. 2.这一步的操作非常简单,打开文件目录进行双击打开即可完成操作. 3.看到题 ...

  7. pycharm过期解决方案

    如果你的pycharm老是过期,你可以直接下载最新版本的pycharm,然后加入一个网站获取激活码即可 http://idea.medeming.com/jets/

  8. case语法案例

    case语法案例 制作nginx启停脚本 1.条件: 2.思路: 3.脚本 添加删除openvppn用户的脚本 1.实现要求 2.具体脚本 case语法案例 制作nginx启停脚本 1.条件: 启动服 ...

  9. Java 复习篇2---jdk

    jdk 文件: bin 该路径下存放了各种工具命令, 其中重要的有javac 和Java conf: 改路径下存放了相关配置文件 include: 该路径下存放了一些平台特定的头文件 jmods; 该 ...

  10. 容器之docker基础

    一 docker的介绍 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup, namespace, Union FS等技术,对应用进程进行封装隔离,并且独立于宿主 ...