java中取整数绝对值_Java之——位运算求整数绝对值通过下面的位运算可以得到一个整数的绝对值
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之——位运算求整数绝对值通过下面的位运算可以得到一个整数的绝对值的更多相关文章
- Java中取小数点后两位(四种方法)
摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法) 一 Long是长整型,怎么有小数,是double吧 java.text.D ...
- Java中取整和四舍五入
import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetInt{ public stati ...
- JAVA中取余(%)规则和介绍
在java中%的含义为取余. java :a%b 数学公式a%b=a-(a/b)*b
- JAVA中取子字符串的几种方式
有这样一串字符串:String s = "共 100 页, 1 2 3 4..."; 假如我想把"100"给取出来,该如何做? 方法一: 采用split的方式 ...
- JAVA中让Swagger产出更加符合我们诉求的描述文档,按需决定显示或者隐藏指定内容
大家好,又见面啦. 在前一篇文档<JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率>中,我们探讨了如何通过自定义注解的方式扩展swagger的能力让Swag ...
- Java中取两位小数
请参考下面函数: private String getFormated(String s){ float f=Float.parseFloat(s); java.text. ...
- Java中取某一个范围的随机数
一.取模操作 public static void main(String[] args) { for (int i = 1; i <= 20; i++) { int j = i % 11; S ...
- Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
import java.util.*; /* * 输入一个整数,计算它各位上数字的和. * (注意:是任意位的整数) */ public class Sum02 { public static voi ...
- 浅谈Java中的补零扩展和补符号位扩展
今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合. ...
- java 中常用的类
java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l static double abs(double a) 获取double 的绝对值 l sta ...
随机推荐
- 从零实现在线云相亲APP|程序员脱单神器(内附源码Demo)
实时音视频通话涉及到的技术栈.人力成本.硬件成本非常大,一般个人开发者基本无法独立完成一个功能健全并且稳定的实时音视频应用.本文介绍一天之内,无任何实时音视频低层技术的android开发者完成实时相亲 ...
- Mars3D入门示例
1. 引言 Mars3D是基于Cesium的Web端的三维GIS库,对Cesium做了进一步封装和扩展 Mars3D官网:Mars3D三维可视化平台 | 火星科技 Mars3D开发手册:开发教程 - ...
- java数据结构与算法(day2)--简单排序
模式:设计api实现api 简单排序 举例(商品排序) 1.1Comparable接口介绍(排序算法更有通用性:对象排序) 创建对象,并且生成豆子.创建Comparable接口 1 package c ...
- c#反射优化
https://www.cnblogs.com/xinaixia/p/5777886.html https://www.cnblogs.com/xinaixia/p/5777961.html
- vue学习笔记:vue.js基础语法
一.VUE 概述 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...
- html音乐播放器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 前端回血day24 flex子项伤的CSS属性
取值 含义 order 可以通过设置order改变某一个flex子项的排序位置.所有flex子项的默认order属性值是0 flex-grow 属性中的grow是扩展的意思,扩展的就是flex子项所占 ...
- ibatis批量数据入库sql
ibaits 批量数据入库sql <insert id="waiter.insertBatch" parameterClass="java.util.List&qu ...
- php ajax跨域问题解决方案
本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用 ...
- Qt中父子页面切换隐藏实现方法 (利用信号槽机制实现)
首先既然你打开了这篇文章,那你一定想到过,将子界面作为父界面的一个属性来实现,但是这样父界面通知子界面会很轻松,但子界面通知父界面怎么搞呢?很显然不能再子界面再实例化父界面(因为这样做会循环引用),那 ...