目录
JDK自带的进制转换
java中可以直接声明二进制、八进制、十进制、十六进制
例如:
二级制: int bin = 0b1100010;
八进制: int oct = 0142;
十进制: int dec = 98;
十六进制: int hex = 0x62;
public static void main(String[] args) {
int bin = 0b1100010;
int oct = 0142;
int dec = 98;
int hex = 0x62;
//前缀是数字0,不是字母o
//英文字母b,x是不区分大小写的
//在指定进制中使用规定的数码
//底层存储都是二进制的形式
//java默认使用十进制,输出显示都是十进制的形式
System.out.println("2进制:" + bin);
System.out.println("8进制:" + oct);
System.out.println("10进制:" + dec);
System.out.println("16进制:" + hex);
//十进制转换成2,8,16进制输出到控制台
int num = 98;
System.out.println("98转换成2进制输出:"+Integer.toBinaryString(num));
System.out.println("98转换成8进制输出:"+ Integer.toOctalString(num));
System.out.println("98转换成10进制输出:"+Integer.toHexString(num));
}
输出如下:
Integer.toString(int i,int radix) 方法,转化为自定义的进制显示,范围为2~36进制,最大范围是36因为英文字母取值a-z总共26个
再加上阿拉伯数字0~9,刚好36个。
//使用Integer.toString(int n,int radix)方法任意进制的转换
System.out.println("98转换成2进制输出:" + Integer.toString(num, 2));
System.out.println("98转换成8进制输出:" + Integer.toString(num, 8));
System.out.println("98转换成16进制输出:" + Integer.toString(num, 16));
System.out.println("98转换成5进制输出:" + Integer.toString(num, 5));
System.out.println("98转换成36进制输出:" + Integer.toString(num, 36));
//超出了最大的36进制,还是默认进行10进制输出
System.out.println("98转换成37进制输出:" + Integer.toString(num, 37));
System.out.println("98转换成100进制输出:" + Integer.toString(num, 100));
输出如下:
那么显示的结果都是String类型的字符串,如何转化回去呢?
- 方式一: Integer.parseInt(String s,int radix) 方法,返回值类型int
- 方法二:Integer.valueof(String s,int radix)方法,返回值类型 Integer
位运算
位运算就是直接对整数在内存中的二进制位进行操作,逻辑运算或者位移操作。
二进制数码本身具有逻辑运算特性。
计算机中的数据存储有位数限制。
比特和字节:
比特(bit):信息量的最小单位,单位是小写b。
字节(byte): 表示信息的最小单位,单位是大写B,1字节=8比特。
机器数:
将数据的首位设定为符号位,0为正,1为负。
机器数特点:符号数字化,数的大小受机器字长的限制。
机器数的形式:原码,反码,补码
规则:
原码:10001111
反码:11110000
补码:11110001
正数反bai码、补码是其du本身。
负数反码为:原码符号zhi位不变,其他位全变dao。
负数补码为:原码从右边数第一个1右边的不变(包括第一个1),第一个1左边的全变,符号位不变。
补码计算方式:正数补码 = 反码 = 原码,负数补码 = 反码+1 .
位运算就是对整数的二进制位进制直接操作。
- 按位与运算: &
定义: 参加运算的两个数据,按照二进制位进行“与”运算,两个数都是1,则结果为1.
规则: 1&1 = 1,1&0=0,0&1=0,0&0=0
示例:14&3 即 0000 1110 & 0000 0011 得 0000 0010 结果是整数2 ,因此14&3 = 2
特点:清零特定位,获取特定位。
场景:可以使用 num & 1 ,来判定数字num的奇偶,二进制的尾数是1的话,说明该数字是奇数。
- 按位或运算:|
定义:参加运算的两个数据,按二进制位进行"或"运算,有一个为1,则结果为1 。
规则:1|1 = 1, 1|0 = 1,0|1=1 , 0|0 =0
示例:14|3 即 0000 1110 | 0000 0011 得 0000 1111 结果是整数15,因此14|3 = 15
特点: 将特定位设为1.
- 按位异或运算:^
定义: 参加运算的两个数据,按二进制位进行“异或”运算,两数不相同,则结果为1.
规则:1^1 = 0 , 1^0 = 1 , 0^1=1 , 0^0 = 0
示例:14|3 即 0000 1110 ^ 0000 0011 得 0000 1101 结果是整数13,因此14^3 = 13
特点:与自身异或得0,与一个数连续异或得自身。
- 按位取反运算:~
定义:对一个二进制数按位取反 0 变 1 ,1变 0
规则:~1 = 0, ~0=1
示例:~14 即 ~0000 1110 得 1111 0001 结果是整数 -15 ,存放是补码,所以转换成原码就是10001111, 因此 ~14 = 15
- 左位移运算:<<
定义: 将 一个二进制数 向左位移对应的 位数。
规则: 符号位不变,右侧低位补0,左侧高位舍弃。
示例:14<<1 , 即 0000 1110 <<1 得 0001 1100 结果是整数28,因此14<<1 = 28
特点: m<<n 等价于 m*2的n次方(在最高位不为1的情况下)
- 右位移运算:>>
定义: 将一个二进制数向右移动对应的位数
规则:符号位不变,右侧低位舍弃,左侧高位,正数补0,负数补1
示例: 14>>1 即 0000 1110 >>1 得 0000 0111 结果是整数 7 ,因此 14>>1 = 7
-14 >> 2 即 1111 0010 >> 2 得 1111 1100 结果是整数 -4 ,因此 -14 >> 2 = - 4
特点 : m>>n 等价于 m/ 2的n次方,(低位为1时,精度会丢失)
- 无符号右位移运算:>>>
规则: 右侧低位舍弃,左侧高位补0
-14 使用1字节得数据表示
示例: -14 >>>2 即 1111 0010 >>>2 得 0011 1100 结果是整数60,因此14>>>2 =60.
-14使用2字节得数据表示
示例: -14>>>2 即 1111 1111 1111 0010 >>>2 得 0011 1111 1111 1100 结果是整数16380
java中的整数类型
大数类 BigInteger
可以存储理论上无限大【计算机无理限制】的整数
数值存储是二进制补码,大端模式存储
可以使用不同进制,进行基本运算,进行位运算。
常用的使用方法:
//创建方法
BigInteger(String val) 十进制字符串表示形式转换为BigInteger
BigInteger(String val,int radix) 指定基数的字符串表示形式转换为BigInteger
static valueOf(long val) 返回其值等于指定long的值的BigInteger
//转字符串
toString(int radix)
//基本运算加减乘除
add(BigInteger val) +
subtract(BigInteger val) -
multiply(BigInteger val) *
divide(BigInteger val) /
remainder(BigInteger val) %
divideAndRemainder(BigInteger val) 返回 / 和 % 的两个BigInteger的数组
compareTo(BigInteger val) 比较两个数的大小
java中的浮点类型
定点数:约定所有数值数据的小数点隐含在某一个固定位置上。
浮点数:数值数据的小数点位置不固定
指数规则:任意实数,都可以由一个定点数*基数的整数次幂得到。
3.14159 = 0.314159*10的1次方 或者 31.4159*10的2次方
单精度float (4字节) 和 双精度 double (8字节)
float : 1位符号位 + 8位阶码 + 23位尾数
double : 1位符号位+ 11位阶码 + 52位尾数
精确小数 BigDecimal
用来对超过16位有效位的小数进行精确的运算。
数值存储使用BigInteger + scale 标度进行存储保证精度。(十进制科学计数法)
BigDecimal 声明创建以及 基本运算。
//创建BigDecimal
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal(0.1); //不推荐
BigDecimal b3 = BigDecimal.valueOf(0.1);
System.out.println(b1.toString());
System.out.println(b2.toString());
System.out.println(b3.toString());
输出如下:
// 除法运算,保留5位小数,四舍五入模式
BigDecimal divide = b3.divide(BigDecimal.valueOf(3), new MathContext(5, RoundingMode.HALF_UP));
System.out.println(divide); //0.033333
java中的字符型和布尔型
字符和字符集
字符: 各种文字和符号的总称,指各国家文字,标点等等....
问题: 计算机只能处理数字,必须把 文本转换成数字才能处理。
字符集:包含字库表,编码字符集,字符编码。
ASCII字符集:
美国标准信息交换代码:基于拉丁字符的编码系统。
标准ASCII指定7位二进制数组合表示128种字符信息,计算机最小单位字节是8位---扩展ASCII.
问题:不同国家有不同的字符,扩展ASCII也无法保证。
Unnicode 字符集:
统一所有国家的字符编码
统一码,万国码:为世界上所有字符都分配了一个唯一的编号。
Unicode只有字库表和编码字符表,没有规定的字符编码。
UTF-4,UTF-8,UTF-16,UTF-32....
UTF(UnicodeTransformationFormat),意为Unicode转换格式。
char类型的存储和计算
char(2字节)使用Unicode 字符集,utf-16
只能表示Unicode编号在65536以内的字符。
char类型加减运算就是按其Unicode编号进行运算。
大写: A-Z: 65-90 , 小写:a-z :97-122 ,数字0-9:48-57
boolean 类型的存储
boolean 用于表示真和假。
单独定义时:存储空间和int一样,4字节32位,存储空间和执行效率上做的取舍。
如果定义在数组中:boolean会编译成byte(1字节8位)类型数组。