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

不同进制的数据表现形式

二进制:由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;
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
    Java小辰阅读 1,106评论 0 2
  • 目前MaxMind对MMDB的读写支持如下Writer:perlReader:CC#JavaPerlPHPPyth...
    openex阅读 8,394评论 0 0
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 1,590评论 4 12
  • 1、常量与变量 程序执行中值不会变化的为常量,会变化的为变量。如定义一个常量PI,表示圆周率,圆周率不会改变;定义...
    元富阅读 591评论 0 0
  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,589评论 0 9