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

news/2024/7/2 23:11:36

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

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

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

 


http://lihuaxi.xjx100.cn/news/804029.html

相关文章

PCI驱动程序框架

PCI驱动程序框架 文章目录PCI驱动程序框架参考资料&#xff1a;一、 PCI驱动框架二、 RK3399驱动致谢参考资料&#xff1a; 《PCI Express Technology 3.0》&#xff0c;Mike Jackson, Ravi Budruk; MindShare, Inc.《PCIe扫盲系列博文》&#xff0c;作者Felix&#xff0c;这是…

0201源码详解-ConcurrentHashMap-线程安全集合类-并发编程(Java)

文章目录1 概述2 主要属性及内部类3 构造函数3.1 无参3.2 带参3.3 tableSizeFor()4 get()-获取值4.1 get()主方法4.2 pread()方法4.3 Node hash值4.4 Node find()方法4.4.1 单链表结点4.4.2 ForwardingNode4.4.3 TreeBin4.4.4 TreeNode5 put()-放入键值对5.1 putVal()-放入键值…

分享12个面向前端开发人员的设计生产力工具

大家好&#xff0c;我们除了埋头写代码&#xff0c;有时候我们会有更多的选择&#xff0c;调整我们的开发和设计流程&#xff0c;借助这些生产力工具&#xff0c;可以大大提高我们的开发效率&#xff0c;好了废话不多说&#xff0c;今天我看了一篇关于这方面的文章&#xff0c;…

SQLServer数据库导出指定表里所有数据成insert语句

以sql server 2008 R2,数据库是Northwind数据库为例,导出指定表所有数据的sql脚本 目标:把Northwind数据库的Orders表导出成insert语句。1. 选择Northwind数据库,右键-任务-生成脚本:2. 在弹出的“生成和发布脚本”的简介窗口,按“下一步”按钮:3. 在“选择对象”窗口,…

第九章(12):STL之常用查找算法

文章目录前情回顾常用查找算法findfind_ifadjacent_findbinary_searchcountcount_if下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&#xff0…

简易三子棋游戏实现

哈喽小伙伴们大家好&#xff0c;我们一起学习三子棋游戏的创建吧。在开始之前我们先来复习一下&#xff0c;函数声明放在头文件中函数定义放在源文件中。那么什么是函数声明和函数定义呢&#xff1f;所谓函数声明就是说明函数的返回参数&#xff0c;函数类型&#xff0c;函数名…

[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开

简介 微信超级管家是一款大神针对微信制作的工具&#xff0c;它的主要功能包括了自动回复、好友计数、自动同意、群发、好友导出、消息日志、无限多开等等&#xff0c;让你拥有无限潜力哈&#xff0c;经常使用微信电脑版的朋友一定会用的上。 下载 微信超级管家 软件功能 1…

SpringBoot+Vue图书馆管理系统

简介&#xff1a;本项目采用了基本的SpringBootVue设计的图书馆管理系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVue图书馆管理系统源码作者LHL项目类型Java EE项目 &#xff08;…