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. .NET周报 【2月第3期 2023-02-18】

    国内文章 2023 年.NET仓库社区年度调查已经开始 https://mp.weixin.qq.com/s/H9xUAO_yAdqm5CIHBs_eqA 中国地区是 .NET 的一个重要的市场和社区 ...

  2. VS Ctrl+D 快速复制上一行

    打开 VS   工具-->选项-->环境-->键盘   选择默认值,确定.     搞定!

  3. Echarts —自定义label标签的样式(formatter,rich,添加图标等操作)

    最近公司项目中在使用 Echarts 绘制图表时,由于默认的 label 标签不能满足设计稿需求,所以研究了对 label标签进行格式化的方案,了解到可以使用 formatter 内容格式器对标签内容 ...

  4. 基于docker的spark分布式与单线程、多线程wordcount的对比实验

    1. 分布式环境搭建 1.1 基于docker的spark配置文件 docker-compose.yml version: '2' services: spark: image: docker.io/ ...

  5. replace 常用积累

    1.替换有,或者.为: obj.keyword.replace(/,|./g,';') 2.替换元素标签类似于<em>文字</em>这种 let name=item.name. ...

  6. 2021.09 ccf csp 第四题 收集卡牌

    2021.09 ccf csp 第四题 收集卡牌 思路 这题如果直接计算,因为不同的分类种数太多,枚举所有的分类情况是一个几乎不可能的复杂任务. 但不同摸牌次数,不同已摸出牌种类的子问题的答案之间,具 ...

  7. tp save()的用法

    save()方法可以新增数据,也可以修改数据 但是要注意,在第二次save()的时候会默认修改 需 model('Keyword')->isUpdate(false)->save($dat ...

  8. Bugku-不可破译的密码[wp]

    一 题目分析 flag.txt cipher.txt (1)密码表形式和维吉尼亚密码一样 (2)看到504Q0304 很容易想到 504B0304 Zip文件头. 二 解题步骤 2.1 解密密文 根据 ...

  9. 【个人笔记】从本地源部署 Office 2016 专业增强版

    ## 0. 大大的说明 本文使用的 Office 2016 为 Office 2016 专业增强版零售版. 零售版需要使用 Office 部署工具才可以自定义安装组件,而 VOL 版本无需部署工具即可 ...

  10. 一条sql同时返回多个count结果

    select * from (select alarm_content name, count(id) `count` from ai_alarm WHERE alarm_content IS NOT ...