Java十六进制与十进制互转

项目过程中,总是要用到十进制与十六进制相互转换的方法,今天来总结记录一下。

十进制整数转十六进制

        int i = -50;  //int是4个字节,32位,取值范围为: -2^31——2^31-1
		String r;
		r = Integer.toHexString(i);
		System.out.println(r);

正数转换后正常,负数转换完为8位

十进制转十六进制:ffffffce

十六进制转十进制整数

    String s = "ffce";
    //确定是正数的转换
    int r1 = Integer.parseInt(s,16);
    System.out.println("最普通的Integer.parseInt:"+r1);
    //2字节16进制数,解析时用shortValue,第一位为f则为负数
    int r2 = Integer.valueOf(s,16).shortValue();
    System.out.println("2字节能解析出负数:"+r2);
    //4字节16进制数,解析时用BigInteger,第一位为f则为负数
    BigInteger bi = new BigInteger(s,16);
    int r3 = bi.intValue();
    System.out.println("4字节能解析出负数:"+r3);

结果如下:

最普通的Integer.parseInt:65486
2字节能解析出负数:-50
4字节能解析出负数:65486

单精度浮点型float十进制转为十六进制

		float f = 123.45f;
		String r;
		int f1 = Float.floatToIntBits(f);
		System.out.println("float转为32位浮点数:" + f1);
		r = Integer.toHexString(f1);
		System.out.println("float转十六进制:" + r);

如果float初值为0,r为0,否则r都有八位。

float转为32位浮点数:1123477094
float转十六进制:42f6e666

十六进制转为十进制单精度浮点型float
主函数里用到HexString2binaryString自定义函数,也是参考了网上大佬的代码。
我的代码适用于四字节的十六进制转为十进制float.

		String s = "c2f6e666"; // -123.45
		float r = BinaryStringToFloat(HexString2binaryString(s));
		System.out.println(r);

HexString2binaryString

// 16进制字符串转化二进制字符串
	public static String HexString2binaryString(String hexString) {
		if (hexString == null || hexString.length() % 2 != 0)
			return null;
		String bString = "", tmp;
		for (int i = 0; i < hexString.length(); i++) {
			tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
			bString += tmp.substring(tmp.length() - 4);
		}
		return bString;
	}

	// 2进制字符串转Float数,包括正数和负数
	static float BinaryStringToFloat(final String binaryString) {
		// float是32位,将这个binaryString左边补0补足32位,如果是Double补足64位。
		/* final String stringValue = LeftPad(binaryString, '0', 32); */
		// 首位是符号部分,占1位。
		// 如果符号位是0则代表正数,1代表负数
		final int sign = binaryString.charAt(0) == '0' ? 1 : -1;
		// 第2到9位是指数部分,float占8位,double占11位。
		final String exponentStr = binaryString.substring(1, 9);
		// 将这个二进制字符串转成整数,由于指数部分加了偏移量(float偏移量是127,double是1023)
		// 所以实际值要减去127
		final int exponent = Integer.parseInt(exponentStr, 2) - 127;
		// 最后的23位是尾数部分,由于规格化数,小数点左边隐含一个1,现在加上
		final String mantissaStr = "1".concat(binaryString.substring(9, 32));
		// 这里用double,尽量保持精度,最好用BigDecimal,这里只是方便计算所以用double
		double mantissa = 0.0;

		for (int i = 0; i < mantissaStr.length(); i++) {
			final int intValue = Character.getNumericValue(mantissaStr.charAt(i));
			// 计算小数部分,具体请查阅二进制小数转10进制数相关资料
			mantissa += (intValue * Math.pow(2, -i));
		}
		// 根据IEEE 754 标准计算:符号位 * 2的指数次方 * 尾数部分
		return (float) (sign * Math.pow(2, exponent) * mantissa);
	}

程序运行,得到-123.45.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值