java二进制相关基础
转载请注明原创出处,谢谢!
说在前面
之前在JVM菜鸟进阶高手之路十(基础知识开场白)的时候简单提到了二进制相关问题,最近在看RocketMQ的源码的时候,发现涉及二进制的内容蛮多,jdk源码里面也是有很多涉及到二进制相关的操作,今天这篇文章仅仅是扫盲篇,后续会介绍灵活运用篇。
说明
任何东西都有规范,提到JAVA就会提到2个规范,JAVA语言规范、JVM规范。JAVA语言规范主要定义JAVA的语法、变量、类型、文法等等,JVM规范主要定义Class文件类型、运行时数据、帧栈、虚拟机的启动、虚拟机的指令集等等。
- JAVA语言规范主要定义什么是JAVA语言。
- JVM规范主要定义JVM内部实现,二进制class文件和JVM指令集等。
规范中数字的内部表示和存储
JAVA八种基本数据类型:整形:byte,short,int,long浮点型:float,double布尔型:boolean字符型:char
| 数据类型 | 所占位数 |
|---|---|
| int | 32bit |
| short | 16bit |
| long | 64bit |
| byte | 8bit |
| char | 16bit |
| float | 32bit |
| double | 64bit |
| boolean | 1bit |
备注:1字节=8位(1 byte = 8bit)


整数的表示
- 源码:第一位为符号位(0表示正数,1表示负数)。
- 反码:符号位不动,原码取反。
- 负数补码:符号位不动,反码加1。
- 正数补码:和源码相同。
备注:补码的好处:
- 使用补码可以没有任何歧义的表示0。
- 补码可以很好的参与二进制的运算,补码相加符号位参与运算,这样就简单很多了。
浮点数表示
在上图中,我们了解到Float与Double都是支持IEEE 754
我们以float来说明:

IEEE754单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。

一个实数V在IEEE 754标准中可以用V=(-1)s×M×2E 的形式表示,说明如下:
- 符号s(sign)决定实数是正数(s=0)还是负数(s=1),对数值0的符号位特殊处理。
- 有效数字M(significand)是二进制小数,M的取值范围在1≤M<2或0≤M<1。
- 指数E(exponent)是2的幂,它的作用是对浮点数加权。
| 符号位 | 指数位 | 小数位 |
|---|---|---|
| 1位 | 8位 | 23位 |
例如根据IEEE754,计算11000001000100000000000000000000的单精度浮点的值。
解题:
| 1 | 10000010 | 00100000000000000000000 |
|---|---|---|
| 符号位 | 指数 | 尾数由于指数不是全部为0 所以小数位附加1 |
| 1 | 10000010 | 1.00100000000000000000000 |
| -1 | 2^(130-127) | (2^0 + 2^-3) |
结论:-1 * (2^0 + 2^-3) * 2^(130-127) =-9
同样,你也可以验证一下十进制浮点数0.1的二进制形式是否正确,你会发现,0.1不能表示为有限个二进制位,因此在内存中的表示是舍入(rounding)以后的结果,即 0x3dcccccd, 十进制为0.100000001, 误差0.000000001由此产生了。
说到这里JVM菜鸟进阶高手之路十(基础知识开场白)的有些问题其实都解答了,所以涉及到钱的小数类型必须使用BigDecimal,禁止使用float和double。
进制的概念
我们常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。
二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。
位运算符
按位与(&)
两位全为1,结果才为1:
0&0=0; 0&1=0; 1&0=0; 1&1=1;
用法:
- 清零:如果想要一个单位清零,那么使其全部二进制为0,只要与一个各位都为零的数值想与,结果为零。
- 取一个数中指定位:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
例如:设X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。
按位或(|)
只要有一个为1,结果就为1:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
用法:常用来对一个数据的某些位置1;找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
例如:将X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。
异或运算(^)
*两个相应位为“异”(值不同),则该位结果为1,否则为0: *
0^0=0;0^1=1;1^0=1;1^1=0;
用法:
- 使特定位翻转:找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或就可以得到; 例如:X=1010 1110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001就可以得到
- 与0相异或,保留原值 例如:X ^ 0000 0000 = 1010 1110
- 两个变量交换值的方法: 1、借助第三个变量来实现: C=A; A=B; B=C; 2、 利用加减法实现两个变量的交换:A=A+B; B=A-B;A=A-B; 3、用位异或运算来实现:利用一个数异或本身等于0和异或运算符合交换律 例如:A = A ^ B; B = A ^ B; A = A ^ B;
取反运算(~)
对于一个二进制数按位取反,即将0变1,1变0: ~1=0; ~0=1;
左移运算(<<)
- 将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补零) 2<<1 = 4 : 10 <<1 =100=4
- 若左移时舍弃的高位不包括1,则每左移一位,相当于该数乘以2。 -14(二进制:1111 0010)<< 2= (1100 1000) (高位包括1,不符合规则)
右移运算(>>)
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2.
左补0 or 补1 得看被移数是正还是负。例:4 >> 2 = 1例:-14(1111 0010) >> 2 = -4 (1111 1100 )
无符号右移运算(>>>)
各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
例如: -14>>>2
即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
=(0011 1111 1111 1111 1111 1111 1111 1100)
= 1073741820
Java打印整数的二进制表示
int a = 1120429670;for (int i = 0; i < 32; i++) { int t = (a & 0x80000000 >>> i) >>> (31 - i); System.out.print(t);}
说明:
- 0x80000000是数的十六进制表示,转成二进制表示为10000000000000000000000000000000
- 运算的优先级,移位运算高于逻辑运算,>>>高于&
- 位逻辑与运算 1&1 = 1 ,0&1 = 0
>>>无符号右移,移出部分舍弃,左边位补0;
欢迎积极留言讨论关于你在实际运用中了解到二进制的一些优秀实践,期待你的留言!!!
**如果读完觉得有收获的话,欢迎点赞、关注、加公众号 [匠心零度] ,查阅更多精彩历史!!! **

java二进制相关基础的更多相关文章
- NIO相关基础篇一
转载请注明原创出处,谢谢! 说在前面 NIO相关知识是很多后续的一些基础知识,所以今天这篇文章仅仅是简单介绍,后续会继续有一到二篇相关NIO内容. 什么是NIO Java NIO( New IO) 是 ...
- JAVA相关基础知识
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...
- Linux 相关基础笔记
html,body { } .CodeMirror { height: auto } .CodeMirror-scroll { } .CodeMirror-lines { padding: 4px 0 ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- Java开发的基础条件:
------------Java开发的基础条件:Java相关的基础+对编程的自己的理解+调试代码+自己的坚持 一定要谦逊,不人云亦云,不去妄言某一门语言或技术好或坏!不是哪门技术有问题,而是(不会用才 ...
- JAVA开发相关
JAVA开发相关1. IntelliJ IDEA开发工具熟练使用2. Maven3. Spring框架(IoC.AOP) 1)数据库相关MyBatis 2)数据库连接池 3)事务.多数据源.跨数据库分 ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
随机推荐
- abapGit简介与教程
你是ABAP开发者?你用abapGit吗? 看到这个问题,读者也许会想,什么是abapGit?就让我们从这个问题开始.简单地说,abapGit是一个以ABAP写成为ABAP服务的Git客户端. 有的读 ...
- getSystemService详解
android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如MountService监听是否有SD卡安装及移除,ClipboardServi ...
- 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集
第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...
- 移动端二三事【三】:transform的注意事项
1.js操作transition时需使用驼峰命名: div.style.WebkitTransform = div.style.transform = "rotate(90deg)" ...
- 暑假练习赛 007 B - Weird Cryptography
Weird Cryptography Description standard input/outputStatements Khaled was sitting in the garden unde ...
- rsync 服务部署详解
第1章 rsync 软件介绍 1.1 什么是rsync rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具. http://www.samba.org/ft ...
- mysql5.7.16安装 初始密码获取及密码重置
在window7下面安装mysql5.7.16,出现一个问题,在初始化时,默认生成了一个密码,导致连接不了数据库.而在5.7以前,默认密码是空的,可以不用密码即可进入数据库.5.7之后的就遇到坑了,下 ...
- javascript中原型链与instanceof 原理
instanceof:用来判断实例是否是属于某个对象,这个判断依据是什么呢? 首先,了解一下javascript中的原型继承的基础知识: javascript中的对象都有一个__proto__属性,这 ...
- Linux修改时区的正确方法
CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 [root@centos7 ~]# ll /etc/localti ...
- postgis几何操作函数集
管理操作函数 AddGeometryColumn - Adds a geometry column to an existing table of attributes. By default use ...