不同进制的数据表现形式
二进制:由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
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>>18 &0xff=(00011111)=31
第三个(低端)字节:8143>>28 &0xff=00000000=0
第四个(低端)字节:8143>>38 &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倍。
但是其它语言,如c的unsigned short 无符号数,它值的范围就是要从0开始,并且比java的short类型保存的数据范围更大。
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;
}