在我们学习算法的过程中,我们首先必须要知道的就是数据(尤其是数字)类型在底层保存的方式。因为这样才能使我们的算法变的更加高效。
在JAVA中我们常用的数字类型是int类型,有过基础的同学应该知道int数据类型的长度为32bit。但实际使用时需要注意只有31位是数字,最高位为符号位(这里不展开讲了,有兴趣的同学可以自己学习一下原码,反码,补码,移码相关的基础知识)。采用二进制的方式保存数据,我们可以通过自己编写代码来展示int类型的数字底层是什么样的,代码如下:
public class Binary {
// int类型转换32位二进制
protected static void binary (int num) {
for (int i = 31; i >= 0 ; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
public static void main(String[] args) {
binary(1);
}
}
我们直接调用binary方法,就可以获取到一个int类型数字的二进制格式。
调用结果如下:
有些同学在网上也可以找到学习视频,这篇文章主要是分享我对binary方法的分析,希望刚学习的小伙伴们能够有所收获,避免浪费较长时间在这里。
核心的代码内容只有两行。
接下来我们一行一行的分析,小伙伴们也可以选择性阅读。
第一行:
第二行:
更核心的逻辑就是第二行中的与运算与左移。我们来一个个介绍。
左移运算:
将数字的底层二进制数据全部向左移动n位,右方空位由0补充。
例如:
1的二进制结果为:
1左移2位的结果为:
我们可以简单认为,假设数字A左移n位就相当于A * 2^n。
最抽象的我认为还是与运算:
与运算(&)的基本逻辑为:
- 1 & 1 = 1
- 1 & 0 = 0
- 0 & 0 = 0
所以num & (1 << i)这里的逻辑是这样的,我们假设num数字为200。
当 i 为31时:
同样,当 i 为30时,同理结果如上:
只有当 i 左移7位时:
此时结果为00000000000000000000000010000000,因为只有第7位的数据上下都是1,与运算后结果还是1,其他位结果为0,转换为10进制为128。
同理,当 i 左移6位时:
此时结果为00000000000000000000000001000000,转换为10进制为64。
所以说明int类型的数字200,底层的32bit的数据第32位为0,第31位为0,第7位为1,第6位为1,其他位的计算方式同理。
正好就是数字200的二进制格式。
不知道这么说容易理解么,但是大家有问题我们可以私信交流~