最近学习java基础语法的时候,对其基本数据结构中的二进制位数与十进制大小间的转换产生了疑惑,想起学习IP地址的时候也貌似产生了相同的困惑,
1、为什么Java中int型数据取值范围是[-2^31,2^31-1],多么神奇的问题,网上找了很多,找不到点子上,自己瞎总结一下子。
上次介绍了JAVA中有趣的位运算,知道了位运算是直接对一个整形的二进制位进行操作,效率上比起加减乘除高不少,因此常运用在对性能很敏感的场景。
在计算机中,一个二进制位是最小的存储单元,由于是二进制,所以能存储的数字只能是0和1。显然,如果我们直接去操作每个二进制位将是很麻烦的过程,所以在编程中我们直接使用的是其他的数据类型,如:byte、int、float。这些数据类型能够使我们的数据存储更加方便,我们只需要关心他们能够存储多大范围和什么样类型的数据就可以了。那么一个byte,也就是我们所说的一字节,他所占用的空间是8个二进制位。
数学运算是计算机的基本用途之一,Java提供了非常丰富的运算符来支持。我们根据运算的特点和性质,把运算符划分为几组:基本算数运算符、自增自减运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其他运算符。下面分别介绍。
最近在刷leetcode的题时,才发现有几道题的利用到Integer类型的最大值和最小值,尤其是在判断是否溢出的时候,有道题就非常经典直接判断最后一位,比如最大值231 – 1的最后一位是7,而最小值 -231 的最后一位是8,这样进行一个判断 8. 字符串转换整数 (atoi) 这道题对我在面试过程中被问到如何判断是否溢出有了很大启发 查下JDK1.6帮助文档是这样写的
在上一篇文章 很清晰!带你图解 Java 程序的结构,变量和类型 里,我们知道 Java 的基本类型分整型类型,浮点型类型和布尔类型三种。那针对不同的类型,Java 提供的运算能力也是各有不同,本篇文章就分析下 Java 基本类型里的各种运算是怎么回事。
首先要了解的概念是 Java 中用补码表示二进制数,补码的最高位代表符号位,最高位是 1 则表示为正数,最高位是 0 则表示为负数。 正数的补码是本身,负数的补码其绝对值的二进制位按位取反后 +1。 例如: +60:二进制表示形式为 0011 1100,补码为本身,也就还是 0011 1100 -60:已知 +60 的二进制表现形式为 0011 1100,按位取反后是 1100 0011,在加 1,就是1100 0100。即表示 -60 的二进制表现形式 1100 0100。 回到正题,那么 byte 表示
为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[ i ] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } ret
关于二进制 关于二进制的概念,网上已经很多,这里不多赘述,只说关键的属性说明和示例。 维基百科 记住,原码是给人看的,补码才是计算机真正使用的。 我们一般所说的二进制是有32位,首位是符号位。0是正数,1是负数。下面我们来根据例子说明二进制与十进制的转换,以及原码补码反码的概念。 二进制转10 进制(32位太长,我们省略我8位方便演示) 规则:从后往前依次下标为0,1,2..n,如果位是1 则记2的下标次方,有多少个是1的都相加。最后根据符号位标示正负即可。 示例1:0000 00
首先我们要都知道, &表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化.
正所谓怕什么来什么,这是知名的“墨菲定律”。Java基础涵盖各个方面,敢说Java基础扎实的人不是刚毕业的学生,就是工作N年的程序员。工作N年的程序员甚至也不敢人人都说Java基础扎实,甚至精通,往往只是“无他唯熟尔”——熟手而已。 IO这块我确实怕,它不难,只有两个方面:输入/输出。但你说它用得多不多,我相信没有你写的并发多,并发往往是处处可见,写着写着就熟了,而IO却往往只是某个模块会涉及,所以也就并不是每个程序员在开发维护自己的模块时都会用到有关IO的API,而碰到的时候常常陷入窘迫,不知道怎
举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
“~”运算符在c、c++、java、c#中都有,要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。
原码比较好理解,也就是该数字不进行其他操作时数字最原始的二进制表示,在Java中我们有熟悉的byte,short,int,long的整数型基本数据类型以及float,double的浮点型基本数据类型。
上一篇:消息队列 ActiveMQ 、RocketMQ 、RabbitMQ 和 Kafka 如何选择?
非十进制(八进制,十六进制)写在文件中它本身就是补码,计算机是不用进行内存转换,它直接存入内存。(因为十六进制本身是补码,所以计算机里面我们看到的都是十六进制去存储)
② char c1 = 'a'; char c2 = '中'; char c3 = '9';
首先了解几个概念: 1、字(Byte)节是长度单位。位(bit)也是长度单位。 2、基本数据类型 所占用空间大小:byte b; 1字节、short s; 2字节、int i; 4字节、long l; 8字节、char c; 2字节(C语言中是1字节)、float f; 4字节、double d; 8字节、boolean bool; false/true 1字节 3、因为计算机通信和存储的时候都是以010101这样的二进制数据为基础的,这儿的一个0和1占的地方就叫bit(位),即一个二进制位。 1Byte=
定义 进制也就是进位计数制,是人为定义的带进位的计数方法。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。 常用进制类型 二进制 计算机底层都是使用二进制进行存储以及运算 0b****;(以0b或者0B开始,*表示0或1)比如:010101 原码、反码、补码 原码 原码:将一个整数转换成二进制表示 以 int 类型为例,int类型占4个字节、共32位。 例如: 2 的原码为:00000000 00000000 00000000 00000010
在 Github 项目mongo-java-driver有一个类ObjectId.java,它的作用是生成唯一 id 的,它的核心实现是下面这样一段代码 [1]:
首先了解几个概念: 1、字(Byte)节是长度单位。位(bit)也是长度单位。
原码 反码 补码的转换 还是比较 简单基础的问题。之前学习java的时候就学过,后来忘记了,忘记了!!!,后来学了位移运算符,左移 右移 无符号右移 之后就由有点儿懵了。
下面这行代码的输出是什么? public static void main(String[] args) { System.out.println(0xffffffff); } 下面两行代码的输出相同吗? public static void main(String[] args) { byte b=-1; System.out.println((int)(char)b); System.out.println((int)(char)(b & 0xff)); } 请尝试在Eclipse中运行
在 Github 项目mongo-java-driver有一个类ObjectId.java,它的作用是生成唯一 id 的,它的核心实现是下面这样一段代码 1:
1.java中常量分类: A:字面值常量 字符串常量 用双引号括起来的内容 举例:”lixiaochi”,”liyan” 整数常量 所有整数 举例:12,23 小数常量 所有小数 举例:12.34,56.78 字符常量 用单引号括起来的内容 举例:’a’,’A’,’0’ 布尔常量 较为特有,只有true和false 举例:true,false 空常量 null(数组部分讲解) /*程序样例: class ConstantDemo { public static void main(String[] args) { System.out.println(“hello”); System.out.println(12); System.out.println(100.12); System.out.println(‘a’); System.out.println(true); System.out.println(false); } } B:自定义常量(后面会讲,通过一些关键字把变量名定义成常量类型)。比如,final或abstract关键字修饰的变量。 */
众所周知,计算机中是以二进制来存储数据的,计算机顾名思义设计之初也是为了计算,那么计算机是如何进行运算的呢?
折腾的心,颤抖的手,只因在 main 函数中执行了一次 int 强转 byte 的操作,输出结果太出所料,于是入坑,钻研良久,遂有此篇。
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。
我们先来说下进制,进制就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位,二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。Java进制分为二进制,八进制,十进制,十六进制, 但是计算机只能处理2进制的数据和指令。
1.如何将数字输出为每三位逗号分隔的格式,例如“1,234,467”? 1 package com.Gxjun.problem; 2 3 import java.text.DecimalFormat; 4 import java.util.Scanner; 5 6 7 /* 8 * 如何将数字输出为每三位逗号分隔的格式, 9 * 例如“1,234,467”? 10 * */ 11 12 public class FloatDirve { 13 14 p
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
可以移位运算的类型有:iuint,int,lang等类型.我们本次使用int类型 一个int类型占4个字节,共32位,带符号位,所以最高位位符号位(使用0,1表示符号位)
CPU(中央处理单元)包括运算器、控制器,用于数据加工处理,能完成各种算数、逻辑运算及控制功能。
复合赋值运算符 += ,-= ,*= , /= ,%= 等, 重点讲解一个+= ,其它的使用是一个道理
我们在做二进制转16进制的时候,需要的是数据的正确性而不是数值的正确性。所以我们进行 0XFF 的时候抹掉了高24位,确保了数据二进制补码的完整新(同时也解释了转化的16进制如果小于10需要在前面加0的原因)。
拿到int的最大值,是1111111111111111111111111111111,31个1,首位是0(代表正数,省略了)
昨天中午,一位粉丝朋友在微信私信我,问:为啥HashMap的hash值计算格式是这样:(h = key.hashCode()) ^ (h >>> 16)?h ^ ^ (h >>> 16)是什么意思?
02.01_Java语言基础(常量的概述和使用)(掌握) * A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) * C:字面值常量的分类 * 字符串常量 用双引号括起来的内容 * 整数常量 所有整数 * 小数常量 所有小数 * 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号 * 布尔常量 较为特殊,只有true和false * 空常量 null(数组部分讲解)
从JDK1.0开始,Integer中就定义了MIN_VALUE和MAX-VALUE两个常量:
读本文前请首先搞懂 “反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。
在学习Java基础语法的时候,初学者的我们可能都会有这么一个疑问为什么byte类型的取值范围为什么是[-128,127]而不是[-127,127]。01111111表示最大的数值:127,因为第一位是符号位,所以11111111应该是最小的数值:-127,不是这样才对?
最近一个月看了学习了很多关于SQL性能优化、Spring核心源码分析、MyBatis核心源码分析、JUC并发包下面的知识点,感觉收获很多。这几天,会陆陆续续产出一些博客,进行知识总结。一边健忘一边学习新知识点,痛苦并快乐着。
要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。
Java基本数据类型 变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量类型为变量分配空间,分配空间只能用来存贮该类型数据 因此,通过定义不同类型变量,可以在内存中存储整数,小数或者字符。 Java的两大数据类型; 内置数据类型 应用数据类型 内置数据类型 Java语言提供了八种基本类型,六种字符类型(四个整数类型,两个浮点型),一个字符类型,还有一种布尔型。 byte: byte数据类型是8位,有符号的,以二进制补码表示的整数。 最小值是-128(-2^7)
变量是内存中的一个存储区域。而数据类型的定义决定了这块存储区域的大小。【变量与数据类型的关系】
昨天有小伙伴私信说,Integer.MAX_VALUE + Integer.MAX_VALUE = -2没搞明白。
领取专属 10元无门槛券
手把手带您无忧上云