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 ...
随机推荐
- 有趣的python库-MyQR
MyQR-个性二维码 基本使用 from MyQR import myqr import os myqr.run( words="hu qing nian ni zhen bang, you ...
- .Net 获取URL中指定参数值
有时候我们调用第三方接口,返回的并不是完整的链接带参数,而我们只需要获取指定的一些参数 例如:code=200&msg=success×tamp=1657539&no ...
- Prometheus插件安装(cadvisor)
简介 当docker服务数量到一定程度,为了保证系统的文档,我们就需要对docker进行监控.一般情况下我们可以通过docker status命令来做简单的监控,但是无法交给prometheus采集, ...
- IP 地址分类及子网划分
IP 地址分类 在现实生活中,一个市区有许多的区,区下面又有很多的街道,街道下面又有很多的小区,A 市区.B 市区就是一个范围,每一个范围都有不同的居民数量.类比到计算机网络,A 类地址可以容纳256 ...
- Spring Boot2中如何优雅地个性化定制Jackson
概述 本文的编写初衷,是想了解一下Spring Boot2中,具体是怎么序列化和反序列化JSR 310日期时间体系的,Spring MVC应用场景有如下两个: 使用@RequestBody来获取JSO ...
- sudo漏洞解决方案--源码转rpm包(spec文件编写)
RPM 知识储备 将源码包打包成rpm包,一般有两种情况 在找包中,能够在网上找到 ".src.rpm" 结尾的包,并且是根据漏洞需要升级的版本的包 在找包中,没有找到 " ...
- 1487. 保证文件名唯一 (Medium)
问题描述 1487. 保证文件名唯一 (Medium) 给你一个长度为 n 的字符串数组 names .你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹. 由 ...
- C++标准库string学习笔记
string概述 作为c++语言用作字符串处理的标准库,和Python字符串类型有较多相似之处.可以使用'='进行赋值,"=="来比较,"+"进行拼接. 构造函 ...
- SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory 解决办法
[oracle@localhost oracle]$ ./sqlplus Error 6 initializing SQL*Plus Message file sp1<lang>.msb ...
- Unity 使用IO流获取PNG/JPG/GIF/BMP的宽高【转】
原文链接:https://blog.csdn.net/flj135792468/article/details/107963280?utm_medium=distribute.pc_relevant. ...