Java: 2进制与基本类型

纲要:

  • 计算机中的进制
  1. 位值制计数法
  2. Java中的进制
  3. 位运算
  • 基本数据类型的存储
  1. Java中的整数类型
  2. IEEE754及BigDecimal
  3. 小数的2进制化
  4. 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类型数组
发布了356 篇原创文章 · 获赞 67 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_39969226/article/details/104920147