首页 > 编程语言 >算法学习01—Java底层的正整数与负整数

算法学习01—Java底层的正整数与负整数

时间:2023-01-16 16:13:05浏览次数:54  
标签:01 正整数 printBinary int 32 31 负数 二进制 Java

算法学习01 — Java 底层的正整数与负整数

本节课学到的知识

  1. 编写一个方法,打印出 int 类型数字的二进制长什么样

  2. 为什么 int 类型的最大值是 2^32 - 1,最小值是 -2^32

  3. 负整数的二进制如何进行计算,为什么?

打印 int 数字的二进制

    public void printBinary(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1<<i)) == 0 ? 0 : 1);
        }
        System.out.println();
    }

为什么 int 类型的最大值是 2^31 - 1,最小值是 -2^31

int 占用 4 个字节, 32 位二进制位;

二进制中的最左边一位用于表示正负符号位,0 表示正数,1表示负数;

所以,只能是 2^31,而不能是 2^32;

同时 0 的二进制是 00000000000000000000000000000000,也就是说,0 在二进制中属于正数,所以正整数是 2^31 - 1;

负整数的二进制如何进行计算,为什么

首先使用上面的 printBinary 方法打印一下 -1 的二进制数:

// 与想象中的 10000000000000000000000000000001 不一样;
11111111111111111111111111111111

因为 Java 底层设计负数的计算方式为:

(1)判断:如果最左边一位是 1,那么表示该数是负数,之后符号位也参与到位运算当中;

(2)对所有 32 位进行取反运算,得出:00000000000000000000000000000000;

(3)然后做 + 1 操作,得出:00000000000000000000000000000001;

(4)最后得出,11111111111111111111111111111111 表示 -1;

那么,为什么要使用这么膈应的方式进行计算呢?

因为如果不这样实现,使用二进制的位运算去实现加减乘除的时候,就需要进行适配了;

说白了,使用 10000000000000000000000000000001 这种样式表示 -1,实现加减乘除的算法时;

正数的底层实现逻辑和负数的将会不一样,为了保证不管是正数还是负数,底层的实现方式、实现逻辑都是一样的,

就需要二进制取反加 1 的方式来表示负数!

如果全部是 1 表示 -1,最小的 int 值怎么表示呢?

    @Test
    public void test() {
        int min = Integer.MIN_VALUE;
        printBinary(min);
        int max = Integer.MAX_VALUE;
        printBinary(max);
    }

    public void printBinary(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1<<i)) == 0 ? 0 : 1);
        }
        System.out.println();
    }

结果:
10000000000000000000000000000000
01111111111111111111111111111111

咱们使用取反加 1 的方式进行反推一下:

10000000000000000000000000000000 取反:01111111111111111111111111111111;

此时,我们发现 01111111111111111111111111111111 就是 Integer.MAX_VALUE 的二进制数;

01111111111111111111111111111111 加 1:10000000000000000000000000000000

哎嘿!又回到了最开始的样子,这也说明了 int 类型的最大值是 2^31 - 1,最小值是 -2^31;

标签:01,正整数,printBinary,int,32,31,负数,二进制,Java
From: https://www.cnblogs.com/whatzyt/p/17055653.html

相关文章

  • C/C++学生成绩管理系统[2023-01-16]
    C/C++学生成绩管理系统[2023-01-16]《C\C++语言课程设计》指导书一、课程设计概要项目名称:学期评优方案设计适用学期:2022年秋季学期适用班级:07D229-07D22C班二、项目......
  • C语言学生宿舍管理系统[2023-01-16]
    C语言学生宿舍管理系统[2023-01-16]用C语言开发一个简单的学生宿舍管理系统。[数据结构]1、学生住宿数据文件。每名学生的住宿信息包括:宿舍号,床位数,姓名,学号电话,寝室长......
  • C语言算术表达式求值[2023-01-16]
    C语言算术表达式求值[2023-01-16]4、算术表达式求值问题描述:编写程序,计算算术表达式串的值,具体要求如下:1.表达式串在运行时输入。2.表达式串支持+、-、、/(精确除)、......
  • [答疑精选]活动图,科主任经常性审签病历,非经常性处理医疗纠纷(2016/6/7)
    活动图,科主任经常性审签病历,非经常性处理医疗纠纷......
  • JavaBean
      ......
  • UML相关工具一览(2016年7月更新)
    UML相关工具一览(截止2016年7月) 整理最近2个月主要版本更新: BOUML6.11.1、CaseComplete2016、CubettoUML4.8.1、Gridraw0.12、HandyUML、Modelmaker11.10、OmniGraf......
  • UML相关工具一览(截止2016年5月)
    UML相关工具一览(截止2016年5月) 整理最近3个月主要版本更新: CubettoUML4.7.1、Modelio3.4、OmniGraffleforMac6.5.2、OmniGraffleforiOS2.7.2、PowerDesigner16.......
  • UML工具大全201601更新
    UML相关工具一览(截止2016年1月) 整理最近两个月主要版本更新:EnterpriseArchitect12.1、RationalSoftwareArchitect9.5、Rational Rhapsody8.1.4、VisualParadigmfo......
  • 2022网鼎杯ezjava分析
    文章首发于sec-inhttps://www.sec-in.com/article/2042拿到题目代码只有一个EvilController控制器,获取base参数值然后base64解码后带入readObject,很明显的一个反序列化......
  • 01:Hello, World!
    ​​原题链接​​总时间限制:1000ms内存限制:65536kB描述对于大部分编程语言来说,编写一个能够输出“Hello,World!”的程序往往是最基本、最简单的。因此,这个程序常常作......