算法学习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—Java底层的正整数与负整数的更多相关文章

  1. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  2. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

  3. Java学习01

    Java学习01 第一章 1.JRE与JDK JDK(JAVA Develop Kit,JAVA开发工具包)提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者; J ...

  4. java底层学习

    额,马上就要面试了,Java的底层肯定是需要了解的.网上找了找java的底层文章,做个记号.java底层主要是类的加载.连接和初始化. 本文主要分为四个方面: (1)java底层概述 (2)new和n ...

  5. Java底层知识学习:Bytecode and JMM

    最近在跟着耗子哥的程序员练级指南学习Java底层知识,结合<深入理解Java虚拟机>这本书在看,写笔记,看资料,成长中…… 目前看完了第二章JMM和各内存区OOM的情况 一篇图文并茂介绍字 ...

  6. Java实现 蓝桥杯 算法提高 01背包

    算法提高 01背包 时间限制:1.0s 内存限制:256.0MB 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入 ...

  7. Java企业实训 - 01 - Java前奏

    前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...

  8. java虚拟机学习-触摸java常量池(13-1)

    java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...

  9. LeetCode初级算法--动态规划01:爬楼梯

    LeetCode初级算法--动态规划01:爬楼梯 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  10. LeetCode初级算法--其他01:位1的个数

    LeetCode初级算法--其他01:位1的个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

随机推荐

  1. vue - 解决页面跳转到外部链接后,ios回退到本页面,生命周期,路由导航守卫钩子都无法触发的问题

    虽然加班,最近心情还是可以的,没多少bug找上门. 乐级生悲,遇到了个奇葩的坑,花了点时间百度才解决...但我离不开的'板砖'是安卓的,对此坑是抗拒的,完全没问题... #此坑描述 ...订单详情某按 ...

  2. 微信小程序学习记录

    尺寸单位 rpx 常常以iphone6为开发基准,  1px = 2rpx,不同设备的比例是不同的: 小程序生命周期 和vue的生命周期很相似,不过小程序的生命周期和页面.组件的生命周期又又一点不一样 ...

  3. docker实战(8)使用docker-compose快速搭建zookeeper集群

    镜像下载 docker pull zookeeper 复制 zookeeper 集群的搭建 创建名为docker-compose.yml的文件 输入以下内容 version: '2' services ...

  4. TCP协议之三次握手(二)

    本节主要研究三次握手出现的一些异常情况和编程相关的知识: 上一节分析了三次握手的过程,本节会回答一些三次握手的小问题,然后利用linux系统调用实践一下简单的网络的编程. 三次握手的常见问题 Q 向一 ...

  5. nginx 负载均衡时,一台tomcat宕机时的问题 自动切换

    如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用.具体配置过程如下: 1. 在http节点下,添加ups ...

  6. git拉取本地或者分支

    拉取本地 git clone 拉取的仓库地址 新建一个文件夹,然后右键 拉取分支到本地 也是新建一个文件夹右键点击 Git Bash Here 然后输入 git clone -b 分支名称 分支地址 ...

  7. 基于python-nmap的扫描代码

    本次代码只利于人员进行分析,没有啥用,小学期作业,被迫工作. 1 import tkinter 2 from tkinter import * 3 import time 4 import nmap ...

  8. UE4 编辑器的非运行时,给StaticMeshActor设置StaticMesh

    用 UAssetManager::GetStreamableManager().LoadSynchronous<UStaticMesh>(FSoftObjectPath(packagePa ...

  9. Nexus5安装PostmarketOS(Alpine Linux)并装上Docker

    ​ Postmarket OS是一个基于Alpine Linux.能够安装到手机或其他移动设备上.当然linux deploy也可以使用SSH,但linux deploy运行在容器里.使用上会有些限制 ...

  10. #Python #微信 #消息防撤回 Python实现微信防撤回

    微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿.在此期间微信也推出了不少的功能如:"摇一摇"."漂流 ...