图解二进制,带你揭开二进制的神秘面纱

你好,这里是网络技术联盟站。

二进制,多么熟悉的字眼,相信只要是学计算机的,二进制绝对是入门的第一节课必学的知识点。你肯定经常会听说“计算机底层数据传输就是通过二进制流”、“二进制就是0和1”等等说辞。

对于二进制,更多的人还是停留在表面层的0和1,这个本身也没有错,不过既然今天写了这篇文章,那肯定是要从里到外扒个彻底。

如果本文对您有帮助,欢迎收藏哦!

让我们直接开始吧!

什么是二进制?

二进制是由Gottfried Leibniz发明的以 2 为底的数字系统,是四种数字系统之一

四种数字系统分别是:二进制、八进制、十进制、十六进制。

计算机系统中的所有数据都由二进制信息组成,二进制只有 2 个值:01

在布尔逻辑中,单个二进制数字只能表示 True (1) 或 False (0) ,但是,可以使用多个二进制数字来表示大数并执行复杂的功能,任何整数都可以用二进制表示。

二进制文详解 二进制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 >> 逻辑右移动运算 将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<>` 数学右移位,高位补充规则 - 正数补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<> 数学右移位 面试题目: 如何优化 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wljslmz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值