java

【Java基础】进制之间的转换

2019-08-20  本文已影响0人  Sraindy

不同进制的数据表现形式

二进制:由0,1,....,7。以0开头
十进制:由0,1......,9。默认整数。
十六进制:由0,1,......9,a,b,c,d,e,f(大小写均可)组成。

System.out.print输入

十进制:System.out.println(100);
八进制:System.out.println(0100);
十六进制: System.out.println(0x10);

Java的Integer类

//将int值转成2,8,16进制
 public static String toString(int i, int radix) //基类,2,8,16
 public static String toHexString(int i) //int值转16进制
 public static String toOctalString(int i)//int值转8进制
 public static String toBinaryString(int i)//in值转2进制
 public static int parseInt(String s, int radix)//将String类型的2,8,16进制的值,转成int值
 public static Integer valueOf(String s, int radix)//将String类型的2,8,16进制的值,转成Integer 值
 public byte byteValue() //int转byte

Java内置的进制转换

/****************************** 十进制 转 其他进制 *****************************/
        int intValue = 10;
        String binaryStr = Integer.toBinaryString(intValue);
        System.out.println("------ 十进制转二进制:" + binaryStr);

        String octalStr = Integer.toOctalString(intValue);
        System.out.println("------ 十进制转八进制:" + octalStr);

        String hexStr = Integer.toHexString(intValue);
        System.out.println("------ 十进制转十六进制:" + hexStr);

        或者
        Integer.toString(int i, int radix) //radix:进制,2,8,10,16

        /****************************** 其他进制 转 十进制 *****************************/
        String binaryStrTmp = "0101";
        int binaryToInt = Integer.valueOf(binaryStrTmp, 2);
        System.out.println("------ 二进制转十进制:" + binaryToInt);

        String octalStrTmp = "20";
        int octalToInt = Integer.valueOf(octalStrTmp, 8);
        System.out.println("------ 八进制转十进制:" + octalToInt);

        String HexStrTmp = "FF";
        int hexToInt = Integer.valueOf(HexStrTmp, 16);
        System.out.println("------ 十六进制转十进制:" + hexToInt);

输出的结果:
------ 十进制转二进制:1010
------ 十进制转八进制:12
------ 十进制转十六进制:a
------ 二进制转十进制:5
------ 八进制转十进制:16
------ 十六进制转十进制:255

使用Integer类中的parseInt()方法和valueOf()方法都可以将其他进制转化为10进制,不同的是parseInt()方法的返回值是int类型,而valueOf()返回值是Integer对象。

整数的二进制表示

整数 分为 正整数,0,负整数
二进制使用最高位表示符号位,用1表示负数,用0表示正数。
正整数二进制表示:
正常的原码表示,每个位置都有一个位权,从右到左,第一位为1,然后依次乘以2,即第二位为2,第三位为4,以此类推。
负整数二进制表示:
用补码表示,就是在原码除符号位外的所有位取反后加1
比如:
-1:首先1的原码表示是00000001,取反是11111110,然后再加1,就是11111111
\color{red}{ byte类型,正数最大表示是 01111111,即127,负数最小表示(绝对值最大)是 10000000,即-128,表示范围就是-128至127}

int如何转换byte

int类型的占4个字节,而byte占1个字节,所以int类型转化为byte类型时会出现位丢失情况,即将int的低8位作为byte类型的值。
例如:int型变量的值为257,对应的二进制是100000001,后8位是00000001,第一个0表示符号位,表示正数,所以变量x的值为1。
int b =234 ,对应的二进制是11101010 ,第一位是1表示符号位,表示负数,所以byte c = (byte)b的值为-22 【 11101010 取反 10010101 再加1 ==》 10010110 】

数据类型转为字节

https://blog.csdn.net/qq_38977097/article/details/80868618
例如:int型8143(00000000 00000000 00011111 11001111)
=>byte[] b=[-49,31,0,0]
第一个(低端)字节:8143>>08 & 0xff=(11001111)=207(或有符号-49)
第二个(低端)字节:8143>>1
8 &0xff=(00011111)=31
第三个(低端)字节:8143>>28 &0xff=00000000=0
第四个(低端)字节:8143>>3
8 &0xff=00000000=0
我们注意到上面的(低端)是从右往左开始的,那什么是低端呢?我们从大小端的角度来说明。
小端法(pttle-Endian)
低位字节排放在内存的低地址端即该值的起始地址,高位字节排位在内存的高地址端
大端法(Big-Endian)
高位字节排放在内存的低地址端即该值的起始地址,低位字节排位在内存的高地址端

大小端模式

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

大端:高位--低字节内容,低位--高字节内容
小端:高位--高字节内容,低位--低字节内容

举例说明:例如数字0x12345678在内存中表现形式为:
1)大端模式:
低地址 -----------------> 高地址
0x12  |  0x34  |  0x56  |  0x78
2)小端模式:
低地址 ------------------> 高地址
0x78  |  0x56  |  0x34  |  0x12

public static int toLittleEndian(int a) {      
 return (((a & 0xFF) << 24) | (((a >> 8) & 0xFF) << 16) | (((a >> 16) & 0xFF) << 8) | ((a >> 24) & 0xFF));}

Java有符号和无符号

内容来源:https://www.cnblogs.com/huzi007/p/6566567.html
无符号数中,所有的位都用于直接表示该值的大小。
有符号数中,最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。

我们举一个字节的数值对比:
无符号数: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20
有符号数: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20
同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。
原因是有符号数中的最高位被挪去表示符号了。
并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。
不过,有符号数的长处是它可以表示负数。
因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。
我们仍一个字节的数值对比:
无符号数: 0 ----------------- 255 有符号数: -128 --------- 0 ---------- 127
同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。
所以二者能表达的不同的数值的个数都一样是256个。
只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数

有符号数包括负数,无符号数只有整数而已,在同一数据类型中,由于内存长度是一样的,所以无符号数比有符号数的最大值大1倍。

\color{red}{ java没有无符号类型,都是有符号类型的数据类型。}
但是其它语言,如c的unsigned short 无符号数,它值的范围就是要从0开始,并且比java的short类型保存的数据范围更大。

image.png

java有符号转无符号

public int getUnsignedByte (byte data){      //将data字节型数据转换为0~255 (0xFF 即BYTE)。
  return data&0x0FF;
}

public int getUnsignedByte (short data){      //将data字节型数据转换为0~65535 (0xFFFF 即 short
  return data&0x0FFFF;
}

public long getUnsignedIntt (int data){     //将int数据转换为0~4294967295 (0xFFFFFFFF即Long
  return data&0x0FFFFFFFFL;
}

获取byte高四位和低四位

public static int getHeight4(byte data){//获取高四位
    int height;
    height = ((data & 0xf0) >> 4);
    return height;
}

public static int getLow4(byte data){//获取低四位
    int low;
    low = (data & 0x0f);
    return low;
}

将两个字节拼接还原成有符号的整型数据

数据域中的数据都按小端存储,示例:数据0x1234,则Byte1为0x12,Byte0为0x34,
byte1是高字节,byte0是低字节
public static int pinJie2ByteToInt(byte byte1, byte byte0) {
        int result = byte1;
        result = (result << 8) | (0x00FF & byte0);
        return result;
    }

或者
public static int pinJie2ByteToInt(byte byte1, byte byte0) {
        int result = byte1;
        result = byte1 *16 * 16 +byte0
        return result;
    }

上一篇 下一篇

猜你喜欢

热点阅读