算法学习01—Java底层的正整数与负整数
算法学习01 — Java 底层的正整数与负整数
本节课学到的知识
编写一个方法,打印出 int 类型数字的二进制长什么样
为什么 int 类型的最大值是 2^32 - 1,最小值是 -2^32
负整数的二进制如何进行计算,为什么?
打印 int 数字的二进制
public void printBinary(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1<<i)) == 0 ? 0 : 1);
}
System.out.println();
}
为什么 int 类型的最大值是 2^31 - 1,最小值是 -2^31
int 占用 4 个字节, 32 位二进制位;
二进制中的最左边一位用于表示正负符号位,0 表示正数,1表示负数;
所以,只能是 2^31,而不能是 2^32;
同时 0 的二进制是 00000000000000000000000000000000,也就是说,0 在二进制中属于正数,所以正整数是 2^31 - 1;
负整数的二进制如何进行计算,为什么
首先使用上面的 printBinary 方法打印一下 -1 的二进制数:
// 与想象中的 10000000000000000000000000000001 不一样;
11111111111111111111111111111111
因为 Java 底层设计负数的计算方式为:
(1)判断:如果最左边一位是 1,那么表示该数是负数,之后符号位也参与到位运算当中;
(2)对所有 32 位进行取反运算,得出:00000000000000000000000000000000;
(3)然后做 + 1 操作,得出:00000000000000000000000000000001;
(4)最后得出,11111111111111111111111111111111 表示 -1;
那么,为什么要使用这么膈应的方式进行计算呢?
因为如果不这样实现,使用二进制的位运算去实现加减乘除的时候,就需要进行适配了;
说白了,使用 10000000000000000000000000000001 这种样式表示 -1,实现加减乘除的算法时;
正数的底层实现逻辑和负数的将会不一样,为了保证不管是正数还是负数,底层的实现方式、实现逻辑都是一样的,
就需要二进制取反加 1 的方式来表示负数!
如果全部是 1 表示 -1,最小的 int 值怎么表示呢?
@Test
public void test() {
int min = Integer.MIN_VALUE;
printBinary(min);
int max = Integer.MAX_VALUE;
printBinary(max);
} public void printBinary(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1<<i)) == 0 ? 0 : 1);
}
System.out.println();
} 结果:
10000000000000000000000000000000
01111111111111111111111111111111
咱们使用取反加 1 的方式进行反推一下:
10000000000000000000000000000000 取反:01111111111111111111111111111111;
此时,我们发现 01111111111111111111111111111111 就是 Integer.MAX_VALUE 的二进制数;
01111111111111111111111111111111 加 1:10000000000000000000000000000000
哎嘿!又回到了最开始的样子,这也说明了 int 类型的最大值是 2^31 - 1,最小值是 -2^31;
最新文章
- robotframework,selenium启动不了打不开浏览器的问题访问不了网页
- 微信小程序小技巧系列《一》幻灯片,tab导航切换
- JQ第二天
- linux哲学思想
- python openpyxl 操作 excel
- hiho_1078_线段树区间修改
- android 在activity中改变标题栏的标题 tabActivity的标题改变
- UVALive - 5116
- SonarQube升级
- poj 3975&;amp;&;amp;hdu 1850 (nim)
- oracle表信息
- 项目中的报错信息,maven报错等的总结
- WebUtils复用代码【request2Bean、UUID】
- linux中MTDflash设备驱动大概
- ASP.NET Core使用NLog记录日志到Microsoft Sql Server
- django在关闭debug后,admin界面 及静态文件无法加载的解决办法
- touch.js 拖动、缩放、旋转 (鼠标手势)
- ibatis的queyrForList和queryForMap区别
- NIO,OIO,AIO区别
- [na]tcp&;udp扫描原理(nmap常用10条命令)
热门文章
- python学习笔记-初始python(1)
- ansible-file
- 版图 shrink
- noi 1.1 5 输出保留12位小数的浮点数
- ZSTUOJ刷题11:Problem D.--零起点学算法106——首字母变大写
- JS实现异步的方法:回调函数callback、事件监听、setTimeout、Promise、生成器Generators/yield、async/awt
- 编译configure常用参数详解
- react常见bug - 查询条件变化,但page未重置为1
- Tesstwo9.1.0配置步骤
- android studio真垃圾