二进制图文详解 二进制Binary 2进制 逢二进一的计数规则。 在计算机内部,一切数据都是2进制的!! 2进制的数字 补码 补码本质是一种解决负数问题的算法。 1. 将数据的一半当做负数使用。 2. 补码在内存中是2进制的,显示的时候为10进制。 - Java利用算法支持了补码计算: - Integer.parseInt() - Integer.toString() 3. 补码的缺点: - 不支持超范围计算 - 超范围计算自动溢出 4. 解决补码的缺点:采用更大范围(更多位数)的补码 Java是如何计算 -2-1 的 补码的规律 1. 最大值的规律:最高位0 剩下全是1 - int类型:一个0,31个1 - long类型:一个0,63个1 2. 最小值的规律:最高位1 剩下全是0 - int类型:一个1,31个0 - long类型:一个1,63个0 3. 负数的最高位是1, 正数最高位是0 - 最高位做为识别正数和负数的标志位:称为符号位 - 注意:符号位不是用来表示正负号的!!! 4. -1 的规律:所有位都是1!! 5. 溢出是有规律的! 是一个周期性计算结果。 - 最大值+1 = 最小值 6. 补码的对称现象:-n = ~n + 1 案例: int max = Integer.MAX_VALUE; System.out.println(Integer.toBinaryString(max)); int min = Integer.MIN_VALUE; System.out.println(Integer.toBinaryString(min)); long lmax = Long.MAX_VALUE; System.out.println(Long.toBinaryString(lmax)); long lmin = Long.MIN_VALUE; System.out.println(Long.toBinaryString(lmin)); //-1的规律 int n = -1; System.out.println(Integer.toBinaryString(n)); long l = -1L; System.out.println(Long.toBinaryString(l)); //最大值+1溢出得到最小值 // 推论:Java中的int数字是按照补码圆环排列的 int m = Integer.MAX_VALUE+1; System.out.println(m);//最小值 //一个数的溢出测试: n = 345; m = n + Integer.MAX_VALUE+1; System.out.println(m);//负数 m = n + Integer.MAX_VALUE+1+ Integer.MAX_VALUE; System.out.println(m);//344 正数 m = n - (Integer.MAX_VALUE+1+ Integer.MAX_VALUE+1); System.out.println(m);//345 正数 经典面试题1 正数的溢出结果是负数(错误!!!) 经典面试题2 int i = Integer.MAX_VALUE+1; System.out.println( Integer.toBinaryString(i)); 选择运行结果(D): A. 11111111111111111111111111111111 B. 1111111111111111111111111111111 C. 01111111111111111111111111111111 D. 10000000000000000000000000000000 经典面试题3 System.out.println(~-55); 如上代码的运算结果: ( 54 ) System.out.println(~-230); 如上代码的运算结果: ( 229 ) System.out.println(~55); 如上代码的运算结果: ( -56 ) 16进制 16进制是2进制的简写形式 2进制运算 1. ~ 取反运算 2. & 与运算(逻辑乘法) 运算规则: 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 与运算用途: n: 00010100 11010111 01010001 11101010 m: 00000000 00000000 00000000 11111111 n&m-------------------------------------- k 00000000 00000000 00000000 11101010 如上的与运算是一个有意义的运算: 意义在于k是数字n的低8位数字!!m是一个分割模板,称为Mask(面具) 案例: int n = 0x14d751ea;//16简写(缩写)的2进制 int m = 0xff;//255 int k = n&m; //输出 n m k 的2进制 3. | 或运算(逻辑加法) 规则: 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1 用途: n = 00000000 00000000 00000000 10110101 m = 00000000 00000000 11011011 00000000 n|m ------------------------------------ k 00000000 00000000 11011011 10110101 //判断是否读取到文件的末尾: ch1 00000000 00000000 00000000 10110101 ch2 00000000 00000000 00000000 11001111 ch3 11111111 11111111 11111111 11111111 ch4 11111111 11111111 11111111 11111111 ch1|ch2|ch3|ch4 ------------------------- -1 11111111 11111111 11111111 11111111 if(ch1|ch2|ch3|ch4 < 0){ throws EOFException(); } 4. >>> 逻辑右移动运算 将2进制数的每个位向右移动,左侧空白补充0 规则: n: 00010100 11010111 01010001 11101010 m = n>>>1; m: 000010100 11010111 01010001 1110101 m = n>>>8; m: 00000000 00010100 11010111 01010001 案例: int n = 0x14d751ea; int m = n>>>1; //按照2进制输出n 和 m m = n>>>8; //按照2进制输出 m k = (n>>>8)&0xff; //按照2进制输出 k > 思考:将一个int拆分为4个8位数 d1 d2 d3 d4? 5. >> 数学右移位运算 复习:移动小数点计算 一个整数 312331. 将小数点先左移动一次 31233.1 原始数据除以10 将小数点先左移动2次 3123.31 原始数据除以100 如果看做小数点不动,数字向右移动一次,原始数据除以10 ... 2进制数有同样现象:数字向右移动一次,原数据除以2 n = 00000000 00000000 00000000 01010000 m = n>>3; m = 00000000000 00000000 00000000 01010 案例: n = 80;// 0x50 m = n>>3;// n<<3 //按照2进制输出 n 和 m //按照10进制输出 n 和 m 区别: 1. `>>` 数学右移位,高位补充规则 - 正数补0 负数补1,结果满足数学规则 - 如果溢出,向小方向取整 2. `>>>` 是逻辑右移位:高位只补充0 提示:如果数学计算 使用 `>>` 6. << 左移位运算 将2进制数位每位向左移动,右侧填充0 拼接int d1 = 00000000 00000000 00000000 11101010 d2 = 00000000 00000000 00000000 01010001 d3 = 00000000 00000000 00000000 11010111 d4 = 00000000 00000000 00000000 00010100 d4<<24 00010100 00000000 00000000 00000000 d3<<16 00000000 11010111 00000000 00000000 d2<<8 00000000 00000000 01010001 00000000 d1 00000000 00000000 00000000 11101010 +------------------------------------------- n = 00010100 11010111 01010001 11101010 ### >> 数学右移位 面试题目: 如何优化 n*8 ? 答案: n<<3 提示: 被乘数一定是 2 的n次幂 如何优化 n%8 ? 答案: n&(8-1) 如何优化 n%4 ? 答案: n&(4-1) 如何优化 n ? 答案: n&(16-1) n%0xf 提示: 除数一定是 2 的n次幂
- 粉丝: 1
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- TG-2024-04-26-183849310.mp4
- 汇编语言的概要介绍与分析
- 个人博客系统设计与开发.zip
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)