二进制,位运算,以及java中的基本数据类型的存储

目录

JDK自带的进制转换

位运算

java中的整数类型

大数类 BigInteger

java中的浮点类型

​精确小数 BigDecimal

java中的字符型和布尔型

char类型的存储和计算

boolean 类型的存储


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 00110000 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 00110000 1111 结果是整数15,因此14|3 = 15

特点: 将特定位设为1.

  • 按位异或运算:^

定义: 参加运算的两个数据,按二进制位进行“异或”运算,两数不相同,则结果为1.

规则:1^1 = 0 , 1^0 = 1 ,  0^1=1 ,  0^0 = 0

示例:14|3 即 0000 1110 ^ 0000 00110000 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位)类型数组。

至此结束,欢迎大家留言探讨,如果喜欢此篇文章的话,就一键三连吧!

猜你喜欢

转载自blog.csdn.net/qq_31905135/article/details/109175947