`

Java中十六进制转换 Integer.toHexString()

    博客分类:
  • Java
阅读更多

为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:

Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6)

 byteVar & 0x000000FF的作用是,如果byteVar 是负数,则会清除前面24个零,正的byte整型不受影响。(...) | 0xFFFFFF00的作用是,如果byteVar 是正数,则置前24位为一,这样toHexString输出一个小于等于15的byte整型的十六进制时,倒数第二位为零且不会被丢弃,这样可以通过substring方法进行截取最后两位即可。

 

import junit.framework.TestCase;

public class Hex extends TestCase {

	public void testPositiveIntToHex() {
		//如果正数小于15时,只输入一位,而不是按我们想像的两位标准十六进制输出显示的,后面解决这个问题
		System.out.println(Integer.toHexString(2));//2
		System.out.println(Integer.toHexString(15));//f
		System.out.println(Integer.toHexString(16));//10
		System.out.println(Integer.valueOf("F", 16));//16
	}

	/*
	 * Integer.valueOf()实质上调用的是Integer.parseInt()来完成的,所以
	 * Integer.parseInt()与Integer.valueOf()功能是一样的,只是返回值不
	 * 一样而已
	 */
	public void testNegativeIntToHex() {
		//负整数时,前面输入了多余的 FF ,没有去掉前面多余的 FF,按并双字节形式输出
		System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE

		//实质上0xFF会像转换成0x000000FF后再进行位运算
		System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE
		System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE

		//注,FE输出时不会为-2,因为此时不会把FE看成负数,valueOf会把所有数字串看成正的
		System.out.println(Integer.valueOf("FE", 16));//254
		//如果要输出-2,只能按以下形式输出
		System.out.println(Integer.valueOf("-2", 16));//-2

		//所以要把 FE 看成负的话,只能在前面加上负号,但是这里输出还不是-2,
		//而是先计算Integer.valueOf("FE", 16),再在结果前加上负
		System.out.println(Integer.valueOf("-FE", 16));//-254

		/* 所以如果要输入某个负数,我们只能先求出该数的绝对值的原码十六进制,再在前面加上负号,
		 * 例如求表示-128,则先对绝对值128求十六进制 80,再在前面加上负号 -80
		 */
		System.out.println(Integer.valueOf("-80", 16));//-128

		/* 为什么说valueOf把所有数字串看成正的呢?请看下面三行代码,因为最大正数为2147483647,
		 * 如果再	在7fffffff基础上加上一个一,运行肯定会出错误(这与直接输出0x80000000不一样),
		 * 那么就可以证明
		 */
		System.out.println(Integer.valueOf("7fffffff", 16));//2147483647
		//此句运行时会报错,因为最大正数为7fffffff,但如 -80000000 却又可以运行,因为没超出整数范围
		//System.out.println(Integer.valueOf("80000000", 16));//不能运行,已注掉
		System.out.println(Integer.valueOf("-80000000", 16));//-2147483648

		/* 注,输出时不是负数,而是正,因为0xFE只有8位,而整数是32位,所以以int形式出现时前
		 * 面会自动补24个零,第一位是零,所以最后是正数
		 */
		System.out.println(0xFE);//254
		System.out.println(-0xFE);//-254
		//但0x80000000已满,无需补,第一位为一,所以最后为负数
		System.out.println(0x80000000);//-2147483648
	}

	public void testNegativeIntToBin() {
		System.out.println(Integer.toBinaryString(-2));//11111111111111111111111111111110
		//实质上0xFF会像转换成0x000000FF后再进行位运算
		System.out.println(Integer.toBinaryString(-2 & 0xFF));//11111110
		System.out.println(Integer.toBinaryString(-2 & 0x000000FF));//11111110

		//与上面十六进制是一样的
		System.out.println(Integer.valueOf("1111111111111111111111111111111", 2));//2147483647
		//下面语句运行会出错,已注掉
		//System.out.println(Integer.valueOf("10000000000000000000000000000000", 2));
		System.out.println(Integer.valueOf("-10000000000000000000000000000000", 2));//-2147483648
		System.out.println(Integer.valueOf("11111110", 2));//254
		System.out.println(Integer.valueOf("-11111110", 2));//-254

		/* 注,Java中没有直接使用二进制表示一个数(目前只支持八与十六进制直接表示法),下面其实是一个
		 * 八进制的数与十进制的数
		 */
		System.out.println(010);//8
		System.out.println(10);//10
	}

	public void testByteToHex() {

		byte negativeByte = -2;
		byte positiveByte = 2;

		/* toHexString方法类型为int型,所以转Hex前参数会提升成整型后再进行转换,过程如下:
		 * 10000010(原码)->11111110(补码)->11111111 11111111 11111111 11111110(提升)
		 * ->FFFFFFFE(转Hex进制输出)
		 */
		System.out.println(Integer.toHexString(negativeByte).toUpperCase());// FFFFFFFE

		/* 第一步把-2转成整型:
		 * 10000010(原码)->11111110(补码)->11111111 11111111 11111111 11111110(转整型)
		 * 第二步把 0xFF 前补24个零:
		 * 00000000 00000000 00000000 11111111
		 * 第三步:把第一二步结果进行与位运算:
		 * 00000000 00000000 00000000 11111110
		 * 最后一步:转十六进制结果为 FE 
		 */
		System.out.println(Integer.toHexString(negativeByte & 0xFF).toUpperCase());// FE		

		//另一种转换,可以针对负数与正数的byte都可以以完整的单字节输出
		System.out.println(Integer.toHexString((negativeByte & 0x000000ff) | 0xffffff00)
				.substring(6).toUpperCase());//FE
		System.out.println(Integer.toHexString((positiveByte & 0x000000ff) | 0xffffff00)
				.substring(6).toUpperCase());//02
	}

	/**
	 * 位运算与算术运行中的类型提升机制是一样的
	 */
	public void testBiteMathematical() {
		System.out.println(0x8000000000000000L);//-9223372036854775808
		System.out.println((int) 0x8000000000000000L);//0
		System.out.println(0x8000000000000010L);//-9223372036854775792
		System.out.println(0x80000000);//-2147483648 
		System.out.println(0x80000010);//-2147483632 

		//0x00000010提升成长整型,最后结果为长整型0x8000000000000010L
		System.out.println(0x00000010 | 0x8000000000000000L);//-9223372036854775792
		//0x0010提升成整形,最后结果为整型0x80000010
		System.out.println(0x0010 | 0x80000000);//-2147483632 
	}
}

 

分享到:
评论
3 楼 u014771876 2015-09-01  
   
2 楼 u014771876 2015-09-01  
   
1 楼 u014771876 2015-09-01  
  

相关推荐

    java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx

    在编程领域,尤其是在Java语言中,进制转换是一项基本的操作,因为不同的进制系统在不同的场景下有不同的应用。CPU通常使用二进制处理数据,而人类更习惯于十进制,程序员尤其是底层开发者则常使用十六进制。八进制...

    java中进制转换(二进制,十进制,十六进制)及字节数组与十六进制的转换

    5. **十六进制转二进制**:先将十六进制转换为十进制,再转为二进制。例如: ```java String hex = "1A"; int decimal = Integer.parseInt(hex, 16); String binary = Integer.toBinaryString(decimal); ``` 6. **...

    Java进制转换方法整理

    一、利用Integer将十进制的数进行进制转换 方法 十进制转换其他进制 使用方法 返回值 10进制转2进制 Integer.toBinaryString(n) 一个二进制字符串 10进制转8进制 Integer.toOctalString(n) 一个八进制字符...

    Java程序十进制转二进制,八进制,十六进制

    在Java编程语言中,将十进制数转换为二进制、八进制和十六进制是常见的操作,尤其在处理计算机数据表示和计算时。本文将深入探讨这些转换方法。 首先,我们要理解不同进制系统的基础。十进制是我们日常生活最常用的...

    JAVA二进制字节数组字符十六进制BCD编码转换.doc

    1. **二进制与十六进制转换** - 二进制是一种基于2的计数系统,只包含两个数字:0和1。 - 十六进制是一种基于16的计数系统,由0-9的阿拉伯数字和A-F的字母(代表10-15)组成。 - 在Java中,可以使用`Integer....

    JAVA实用进制转换

    如果想要直接从二进制、八进制或十六进制转换为十进制,可以使用`Integer.parseInt(String s, int radix)`方法。 - **使用`parseInt`进行转换**: - 示例:`Integer.parseInt("0101", 2)` 返回 `5` (二进制0101转换...

    java实现各进制之间转换

    十六进制转换可以使用`Integer.parseInt()`方法配合基数16,以及`toBinaryString()`、`toOctalString()`。例如,将十六进制数"7B"转换为二进制: ```java String hex = "7B"; int decimal = Integer.parseInt...

    十六进制字符串按位异或运算工具和java位异或运算

    在Java中,我们可以利用`Integer.parseInt()`方法将十六进制字符串转换为整数,再使用位运算符`^`来进行异或操作。首先,我们需要将输入的十六进制字符串按空格分隔,然后对每个分隔后的十六进制数进行异或运算。...

    Java进制转换实现

    本文将深入探讨Java中如何进行进制转换,包括二进制、八进制、十进制和十六进制之间的转换。这对于任何对Java感兴趣或者正在学习Java的开发者来说都是必备的知识点。 首先,我们来看一下如何在Java中进行基本的进制...

    用java程序实现各进制转换

    在本文中,我们将讨论如何使用Java实现各进制转换,包括十进制到二进制、八进制和十六进制的转换。 在Java中,我们可以使用Integer类提供的方法来实现进制转换。Integer类提供了多种方法来将十进制数转换为其他进制...

    JAVA 进制转换全攻略.docx

    在Java编程语言中,进制转换是常见的操作,特别是在处理数据表示、编码或者解析用户输入时。本篇文章将深入探讨Java中的进制转换方法,包括从十进制转换到其他进制,以及从其他进制转换回十进制。 1. **十进制转...

    java 十进制 十六进制 互转

    Java中的`Integer.toHexString(int i)`方法可以将一个十进制整型转换为十六进制字符串表示形式。该方法返回的是一个表示指定整数的无符号十六进制字符串。 例如: ```java int decimal = 253; String hex = ...

    Java 实现控制台输入任意字符,转换成十六进制、二进制和十进制

    二进制转换通常通过`Integer.toBinaryString()`来实现,而十六进制转换则可使用`Integer.toHexString()`。 下面是一个简单的Java程序,演示了如何实现这个功能: ```java import java.util.Scanner; public class...

    JAVA实用进制转换.pdf

    - `Integer.parseInt("FFFF", 16)` 返回 `-1`,因为`FFFF`在十六进制中等于`65535`,但在Java中,超过`32767`的正整数会溢出,变成负数。 - `Integer.parseInt("876", 8)` 返回 `702`,因为`876`在八进制中代表十...

    用java如何将十进制整数转成二进制和十六进制形式(csdn)————程序.pdf

    在十六进制转换中,需要注意的是,由于十六进制字符可能不是数字,所以需要特别处理。一旦`n`变为0,循环结束,最后打印出结果字符串`c`。 总结一下,这两个转换方法虽然简单,但对于初学者来说是非常基础且实用的...

    关于在Idea调试的时候如何显示16进制的处理.doc

    java.lang.String hex = java.lang.Integer.toHexString(this&0xFF); if (hex.length()) { hex = "0"+hex; } return "0x"+hex.toUpperCase() +" ["+this+"]"; ``` 这个表达式将字节转换为 16 进制表示,并添加“0x...

    基于java实现的二进制、八进制、十进制、十六进制的转换

    在Java中,我们经常需要将不同进制的数值相互转换,例如二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)。下面将详细阐述如何使用Java实现这些进制之间的转换,并结合...

    java进制转换入门

    在Java编程语言中,进制转换是常见的操作,特别是在处理数据表示、编码或者解析用户输入时。本篇文章将深入探讨Java中的进制转换,包括从十进制转换为其他进制,以及从其他进制转换回十进制的方法。 1. **十进制转...

Global site tag (gtag.js) - Google Analytics