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. [IOI2014]friend 朋友

    题目传送门 似乎是我的第一篇 IOI 题解? 思路 虽然说是 IOI 题,但是其实并没有那么难. 这个题目描述比较杂乱,简单的描述就是:给你一些关系,你需要选出一些点,使这些点的权值和最大,并且这些点 ...

  2. PHP的25种框架

    本篇文章给大家分享的内容是25种PHP框架 -有着一定的参考价值,有需要的朋友可以参考一下. 世界流行框架汇总 在项目开发中,一些架构和代码都是重复的,为了避免重复劳动,于是各种各样的框架诞生了. 在 ...

  3. Shell命令-基础

    Shell命令 1 变量 定义变量时,变量名不加美元符号$,注意,变量名和等号之间不能有空格 a="myname" 用语句给变量赋值时, for file in `ls /etc` ...

  4. SpringMVC:RESTful案例

    目录 相关准备 功能清单 具体功能:访问首页 ①配置view-controller ②创建页面 具体功能:查询所有员工数据 ①控制器方法 ②创建employee_list.html 具体功能:删除 ① ...

  5. Vulhub 漏洞学习之:DNS

    Vulhub 漏洞学习之:DNS 1 DNS域传送漏洞 DNS协议支持使用axfr类型的记录进行区域传送,用来解决主从同步的问题.如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致 ...

  6. vue 组件通信方式 ,父子、隔代、兄弟 三类通信,六种方法

    (1)props / $emit 适用 父子组件通信 (2) ref 与 $parent / $children 适用 父子组件通信 (3)$attrs / $listeners 适用于 隔代组件通信 ...

  7. 07#Web 实战:仿 GitHub 个人主页项目拖拽排序

    实现效果图 GitHub 和 Gitee 个人主页中可以对自己的项目进行拖拽排序,于是我就想自己实现一个.本随笔只是记录一下大概的实现思路,如果感兴趣的小伙伴可以通过代码和本随笔的说明去理解实现过程. ...

  8. EF Corexxxxnstance with the same key value for {'Id'} is already being tracked.

    AsNoTracki或者全局禁用 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // ...

  9. 云服务器 CentOS 的使用历程

    ------------恢复内容开始------------ CentOS图形页面的下载 安装X(X Window System),命令如下: yum groupinstall "X Win ...

  10. 【面试题】 webpack面试篇

    1.与webpack类似的工具还有哪些?谈谈你为什么选择webpack? grunt 优点:出现的比较早,第一代打包工具 缺点:配置项太多,只有一个配置文件,而且不同的插件可能有自己的配置字段,学习成 ...