JAVA打印数字二进制编码逻辑说明

在我们学习算法的过程中,我们首先必须要知道的就是数据(尤其是数字)类型在底层保存的方式。因为这样才能使我们的算法变的更加高效。

在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类型数字的二进制格式。

调用结果如下:

JAVA打印数字二进制编码逻辑说明_第1张图片

 有些同学在网上也可以找到学习视频,这篇文章主要是分享我对binary方法的分析,希望刚学习的小伙伴们能够有所收获,避免浪费较长时间在这里。

核心的代码内容只有两行。

JAVA打印数字二进制编码逻辑说明_第2张图片

 接下来我们一行一行的分析,小伙伴们也可以选择性阅读。

第一行

JAVA打印数字二进制编码逻辑说明_第3张图片

第二行

JAVA打印数字二进制编码逻辑说明_第4张图片

 更核心的逻辑就是第二行中的与运算与左移。我们来一个个介绍。

左移运算

将数字的底层二进制数据全部向左移动n位,右方空位由0补充

例如:

1的二进制结果为:

JAVA打印数字二进制编码逻辑说明_第5张图片

 1左移2位的结果为:

JAVA打印数字二进制编码逻辑说明_第6张图片

 我们可以简单认为,假设数字A左移n位就相当于A * 2^n

 最抽象的我认为还是与运算:

与运算(&)的基本逻辑为:

  • 1 & 1 = 1
  • 1 & 0 = 0
  • 0 & 0 = 0

所以num & (1 << i)这里的逻辑是这样的,我们假设num数字为200

当 i 为31时:

JAVA打印数字二进制编码逻辑说明_第7张图片

同样,当 i 为30时,同理结果如上:

JAVA打印数字二进制编码逻辑说明_第8张图片

 只有当 i 左移7位时:

JAVA打印数字二进制编码逻辑说明_第9张图片

此时结果为00000000000000000000000010000000,因为只有第7位的数据上下都是1,与运算后结果还是1,其他位结果为0,转换为10进制为128。

同理,当 i 左移6位时:

JAVA打印数字二进制编码逻辑说明_第10张图片

此时结果为00000000000000000000000001000000,转换为10进制为64。

所以说明int类型的数字200,底层的32bit的数据第32位为0,第31位为0,第7位为1,第6位为1,其他位的计算方式同理

正好就是数字200的二进制格式。

不知道这么说容易理解么,但是大家有问题我们可以私信交流~

 

你可能感兴趣的:(算法,java,开发语言,算法)