欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java: 2进制与基本类型

程序员文章站 2024-03-18 19:41:58
...

纲要:

  • 计算机中的进制
  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进制:

Java: 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进制:

Java: 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;

Java: 2进制与基本类型

  • 前缀是数字0,不是字母o
  • 英文字母b x 是不区分大小写的
  • 指定进制中使用规定的数码
  • 底层存储的都是2进制的形成的,默认使用10进制输出显示。Java: 2进制与基本类型

JDK中的进制转换方法:

  • 转换2进制显示:
    Integer.toBinaryString()

 

  • 转换为8进制显示:
Integer.toOctalString()
  • 转换为16进制显示:
Integer.toHexString()
  • 扩展:Integer.toString(int i, int radix)参数i是要转换的值,参数radix(范围2~36)是进制.这样就可以转化为自定义的进制显示。

Java: 2进制与基本类型

扩展:
显示结果都是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

Java: 2进制与基本类型

Java: 2进制与基本类型

 

其基本运算:

Java: 2进制与基本类型

还有取余、比较等就不贴图了。 

其位运算:

  • and
  • or
  • xor
  • not
  • shiftLeft
  • shiftRight

2.IEEE754及其BigDecimal

IEEE754的实值计算规则:

  • float(32位): Java: 2进制与基本类型

8位的阶码偏移值就是127.

e.g:  Java: 2进制与基本类型

求它的真实值:

Java: 2进制与基本类型

 

  • double(64位): Java: 2进制与基本类型
  • 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(不推荐)

Java: 2进制与基本类型

Java: 2进制与基本类型

运算同BIginteger:

注意divide():若无法表示准备的商值,就抛出ArithmeticException

Java: 2进制与基本类型

解决办法:定义舍入情况

Java: 2进制与基本类型

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类型数组
相关标签: 编程科普