Java: 2进制与基本类型
纲要:
- 计算机中的进制
- 位值制计数法
- Java中的进制
- 位运算
- 基本数据类型的存储
- Java中的整数类型
- IEEE754及BigDecimal
- 小数的2进制化
- Java中的字符型和布尔型
计算机中的进制
1.位值制计数法
定义: 按位置决定数值的方式来计数的方法
一个数的大小是用一组有顺序的数字表示。
例如: 1 2 3的全排列是表示不一样的数值。[可以自己试着用dfs深度优先遍历试试全排列]
数字所表示的大小,取决于它所代表的数值和所处的位置。
扩展知识:
1.数码:使用的数字符号
2.基数:每个进制的基数
3.位权:固定位置对应的单位值。
例如:10进制的数码:0 1 2 3 4 5 6 7 8 9
10进制的基数: 10
10进制的位权: 个 十 百 千 万 。。。。。
例如:2019中的2代表1000的个数,0代表100的个数,1代表10的个数,9表示1的个数。
所以2019 = 2* 1000 + 0* 100 + 1*10 + 9 *1 = 2*10^3 + 0*10^2+1*10^1+9*10^0
可以看出,位权就是数码位置所代表的固定单位值 = “基数^N”。
而N(指数) 的规律: 从0开始,从右到左,顺序递增
由上面可以推出:
2进制的计数规则:
数码:0 1
基数: 2
位权: 基数的幂次方:从右到左2的0次方、2的1次方、2的2次方.。。
2.2进制转化为10进制:
规则:展开位权进行求和运算
e.g: 100110转化为10进制:
=1*2^5+0*2^4+0*2^3+1*2^2+1*2^1+0*2^0 = 38
3. 10进制转化为2进制:
规则:除2取余直到运算结果=0,则将余数倒序排列得到最终结果。
e.g: 29转化为2进制:
所以结果=11101
4. 2进制的小数部分:
e.g: 10进制的小数:0.1256 = 1*(10^(-1))+2*(10^(-2))+5*(10^(-3))+6*(10^(-4))
e.g: 2进制的小数:0.1101 = 1*(2^(-1))+1*(2^(-2))+0*(2^(-3))+1*(2^(-4))
即:2进制的小数位权从左到右:2^(-1)、2^(-2)、2^(-3)、2^(-4).。。。
5. 2进制的小数部分:2进制转10进制:
规则:展开位权进行求和运算
e.g: 0.1101 =1*(2^(-1))+1*(2^(-2))+0*(2^(-3))+1*(2^(-4))
6. 2进制的小数部分:10进制转2进制:
规则:小数部分*2直到小数部分=0,每次计算结果的整数部分正序排列。
e.g: 0.85转化为2进制:
出现无限循环的结果是因为2进制智能将数值2等分,无法进行2等分的时自然就是无限循环了。
7. 8进制与16进制:
8进制基数8,数码0~7,位权8^0、8^1、8^2、8^3.。。
16进制基数16,数码0~9 A~F,位权16^0、16^1、16^2、16^3.。。
2进制与8进制的转换:每3位2进制数可转换位1位8进制数【从右到左转换,不足3位补0】
2进制与16进制的转换:每4位2进制数可转换位1位16进制数【从右到左转换,不足4位补0】
8. Java中的进制
jdk中自带的进制转换:
- java可以直接声明 2 8 10 16进制
e.g: 2进制: int bin = 0b1100010;
8进制:int oct = 0142;
10进制:int dec = 98;
16进制:int hex = 0x62;
- 前缀是数字0,不是字母o
- 英文字母b x 是不区分大小写的
- 指定进制中使用规定的数码
- 底层存储的都是2进制的形成的,默认使用10进制输出显示。
JDK中的进制转换方法:
- 转换2进制显示:
Integer.toBinaryString()
- 转换为8进制显示:
Integer.toOctalString()
- 转换为16进制显示:
Integer.toHexString()
- 扩展:Integer.toString(int i, int radix)参数i是要转换的值,参数radix(范围2~36)是进制.这样就可以转化为自定义的进制显示。
扩展:
显示结果都是String的字符串,如何转化回去?
1. Integer.parseInt(String s, int radix)
2. Integer.valueof(String s, int radix)
9. 2进制的位运算:
位运算:直接对整数在内存中的2进制位进行操作。[逻辑操作、位移操作]
2进制数码本身具有逻辑运算特性,计算机中的数据存储有位数限制。
扩展知识:比特与字节、机器数
比特bit: 信息量的最小单位,单位:b。即2进制中的1位
字节byte: 表示信息的最小单位,单位:B。即8位 1byte = 8bit
计算机中表示数据都以字节为单位。
机器数:将符号数字化的数。将数据的首位设定为符号位,0为正,1为负。
机器数特点:符号数字化、数的大小受机器字长的限制。
机器数的形式:原码、反码、补码(正数补码=反码= 原码,负数补码=反码+1)
逻辑操作:
- 按位与&
- 按位或|
- 按位异或^
- 按位取反:~
位移操作:
- 左移<< 符号位不变,右侧低位补0,左侧高位舍弃
- 右移>> 符号位不变,右侧低位舍弃,左侧高位正数补0负数补1
- 无符号右移>>> 右侧低位舍弃,左侧高位补0(不管正负数都补0)
基本数据类型的存储
1.java中的整数类型:
- java的4种整形:byte 1字节 short 2字节 int 4字节 long 8字节.[整数类型都是使用2进制补码存储]
- 多字节类型的存储、传输时的字节顺序
- 使用BigInteger进行任意精度的整数运算
大端模式和小端模式:指的是多字节数据在计算机中2种传输和存储的顺序。
大端模式:高位字节放在低地址,低位字节放在高地址
小端模式:低位字节放在低地址,高位字节放在高地址
地址的高低:计算机系统中每个字节的存储空间都有个地址编号,从0开始一直到最后。每个空间都是1个字节的 大小,数据都是通过地址编号取出来的。地址编号也就是个数值,数值小的就叫低地址,数值大的就叫高地址。
字节的高位低位:例如int : 2000 = 0x00 00 07 d0
高位字节就是指位权大的字节。低位字节就是指位权小的字节。
大数类BigInteger:
long类型的64位长度大概可以表示900亿亿的正负范围,而Biginteger在代码层面设计的是1300亿位的整数,理论视为无限大。
- 可以存储理论无限大【计算机无理限制】的整数
- 数值存储的是2进制补码,大端模式排序
- 可以使用不同进制,进行基本运算,进行位运算。
BigInteger是引用数据类型,在jdk中有很多种构建方式:
常用创建方法 | 摘要 |
BigInteger(String val) | 10进制字符串表示形式转换为BigInteger |
BigInteger(String val,int radix) |
指定基数的字符串表示形式转换为BigInteger |
static valueOf(long val) | 返回其值等于指定long的值的BigInteger |
其基本运算:
还有取余、比较等就不贴图了。
其位运算:
- and
- or
- xor
- not
- shiftLeft
- shiftRight
2.IEEE754及其BigDecimal
IEEE754的实值计算规则:
- float(32位):
8位的阶码偏移值就是127.
e.g:
求它的真实值:
- double(64位):
- IEEE754标准中格式化的浮点数真值表示公式
浮点型的精度情况:
真值F(绝对值)=尾数M*2^(E阶码)
float尾数是23位2进制数,转化位10进制,有效数字6~7位
double尾数是52位2进制数,转化位10进制,有效数字15~16位
BigDecimal:
- 用对超过16位有效位的小数进行精确运算。
- 数值存储使用BIgIneger+scale标度进行存储保证精度(10进制的科学计数法)
其使用:
创建方法 | 摘要 |
BigDecimal(String val) | 将字符串表示形式转换为BigDecimal |
BigDecimal(double val) | 将double转换为BigDecimal(不推荐) |
运算同BIginteger:
注意divide():若无法表示准备的商值,就抛出ArithmeticException
解决办法:定义舍入情况
3.小数的2进制化:
定点数:约定所有数值数据的小数点隐含在某一个固定位置上。
浮点数: 数值数据的小数点位置不固定
指数规则: 任意实数,都可以由一个定点数*基数的整数次幂得到。
例如3.14159 = 0.314159*10^1
e.g:(2.75)10 = (10.11)2 = 1.011*2^1=0.1011*2^2=...
定点数部分:尾数。
指数部分:阶码。
逻辑上,采用符号位、阶码、尾数来表示一个数。
浮点数存储缺点:尾数和阶码位数不固定、尾数的定点形式不固定。
2进制浮点算数标准: IEEE754
IEEE754中2进制浮点标准:
- float4字节、double8字节
- float = 1位符号位S+8位阶码E+23位尾数M
- double= 1位符号位S+11位阶码E+52位尾数M
IEEE754中尾数的定点形式:
- 尾数M: 纯小数形式,小数点在尾数最前端,通常为规约形式
- 规约形式:在科学表示法下,小数最高有效位是1(整数部分)
- 尾数M的表示范围:(0<=M<1),规约形式实值=1+M
IEEE754中阶码的记录形式:
- 浮点数的阶码通常用移码来表示
- 移码:将数值正向偏移(2^(e-1)) ,等于符号位取反的补码
- 阶码: 用移码(标准移码-1)记录指数,实际偏移值为(2^(e-1)-1)
4.java中字符型和布尔类型:
- 字符和字符集
- ASCII和Unicode
- char类型的储存和计算原理
字符:各种文字和符号的总称,指各国家文字、标点等
可是计算机只能处理数字,必须把文本转换为数字才能处理。
所以字符集出生了:包含字库表、编码字符集、字符编码
ASCII字符集:美国标准信息交换代码,基于拉丁字符的编码系统。
标准的ASCII指定7位的2进制组合表示128种字符信息。
计算机最小单位字节是8位——扩展ASCII
但是不同国家有不同的字符,扩展ASCII无法保证,所以Unicode出现了。
Unicode:统一码、万国码,为世界上所有字符都分配了一个唯一的编号。
但是问题就是存储空间极大浪费,只有字库表和编码字符表,没有规定字符编码。
所以utf-4,utf-8,utf-16,utf-32...
utf(unicode transformationFormat)意为Unicode转换格式。
char类型的存储与计算:
- char2字节使用unicode字符集,utf-16
- 只能显示unicode编号在65536以内的字符
- char类型加减运算是按其Unicode编号进行运算的[结果默认是int类型]
boolean类型的存储:
- 仅需1位bit
- 单独定义时,存储空间与int一样,4字节32位,jvm并没有对boolean进行支持,而是转换为int运算。[储存空间与执行效率上做的取舍]
- 如果定义在数组种,boolean会编译成byte类型数组